C++容器功能非常强大,除了包装了基础的数据结构之外,还封装了有关该数据结构相关的增删查改算法。
1 STL String
- 构造
- 遍历
- string和char *转换
- 拼接
- 查找和替换
- 插入和删除
- 算法相关
1.1 构造
string有4种构造方式:- 1 通过const char*赋值
- 2 构造函数初始化
- 3 拷贝构造函数赋值
- 4 使用N个字符进行初始化
int main() {
string s1 = "aaaa";
string s2("bbbb");
string s3 = s2;
string s4(10, 'a');
cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;
return 0;
}
1.2 遍历
遍历有3种方式:- 1 数组方式,使用[]
- 2 at()
- 3 stl迭代器遍历
int main() {
string s1 = "aaaa";
for (int i = 0; i < s1.size(); i++) {
cout << s1[i] << endl;
}
for (int i = 0; i < s1.size(); i++) {
cout << s1.at(i) << endl;
}
for (auto iter = s1.begin(); iter != s1.end(); iter++) {
cout << *iter << endl;
}
return 0;
}
1.3 string和char *的转换
- string需要通过c_str()方法才能转成const char *
- const char*可以直接赋值成为string
1.4 string的拼接
- string类型+
- append方法
1.5 string的查找和替换
- find函数用来查找字符串中从位置x开始指定的字符的位置。
- replace函数用来替换字符串中指定位置的字符,原理:先删除该字符,然后重新插入。
- find(str, index)
- replace(offindex, len, str)
int main() {
string s1 = "hello world";
size_t offindex = s1.find("lo", 0);
cout << offindex << endl;
s1.replace(offindex, 2, "xx");
cout << s1 << endl;
return 0;
}
1.6 string的插入和删除
- insert(index, string)
- erase(iter_begin, iter_end)
int main() {
string s1 = "hello world";
s1.erase(s1.begin(), s1.begin() + 3);
cout << s1 << endl;
s1.insert(0, "hel");
cout << s1 << endl;
return 0;
}
2 Vector
2.1 初始化
vecor同样有4种初始化方式:
- 1 直接初始化 vector v1 = {1, 2, 3};
- 2 拷贝构造函数 vector v2 = v1;
- 3 部分元素初始化 vector v3(v2.begin(), v2.end());
- 4 N个元素M初始化 vector v4(N, M);
2.2 遍历
[] 和 at
2.3 删除
erase(iter, iter+n);
2.4 插入
insert(位置,元素) 位置都需要使用迭代器的位置
insert(位置,数量,元素)
int main() {
vector vec = {1, 2, 3};
vec.insert(vec.begin()+3, 4);
for (auto v : vec) {
cout << v << endl;
}
return 0;
}
3 deque
deque是一个双端容器数组,可以在头部和尾部操作元素,deque是stack和queue的底层容器。- push_back()
- push_front()
- pop_back()
- pop_front()
- distance(v1.begin(), it) 求取迭代器it距离begin的距离
int main(int argc, const char * argv[]) {
//定义deque对象
deque d1;
//尾部插入元素
d1.push_back(10);
d1.push_back(20);
d1.push_back(30);
//头部插入元素
d1.push_front(1);
d1.push_front(2);
d1.push_front(3);
//尾部删除元素
d1.pop_back();
//头部删除元素
d1.pop_front();
//修改头部和尾部的值
d1.front() = 111;
d1.back() = 222;
//查找元素为1的下标
//通过distance求取下标
deque::iterator it = d1.begin();
while (it != d1.end()) {
if (*it == 1) {
cout << "下标:" << distance(d1.begin(), it) << endl;
}
it++;
}
//遍历
for (deque::iterator it = d1.begin(); it != d1.end(); it++) {
cout << *it << " ";
}
cout << endl;
return 0;
}
4 list
双端链表,可以在头尾插入和删除元素,但是由于其为链表的特性,无法随机访问。 list的删除提供了remove和erase:- erase照常需要提供迭代器的开始和结尾
- remove可以删除指定的值
int main(int argc, const char * argv[]) {
//创建list对象
list l;
//添加数据
for (int i = 0; i < 10; i++) {
l.push_back(i);
}
l.push_back(100);
l.push_back(100);
//删除头部元素
l.erase(l.begin());
//删除某个区间
list::iterator it = l.begin();
it++;
it++;
it++;
l.erase(l.begin(), it);
//移除值为100的所有元素
l.remove(100);
//遍历
for (list::iterator it = l.begin(); it != l.end(); it++) {
cout << *it << " ";
}
cout << endl;
return 0;
}
5 set和map
set的key和value相同,主要是用来去重。
map的key的value可以不一致,用来当做字典使用。
set详细结构:
map的详细结构:
set的插入和删除:
- s1.insert(元素)
- s1.erase(iter)
map的插入和删除:
- m1.insert(make_pair(2, 2));
- m1.erase(iter);
6 匿名函数用于排序
6.1 vector排序
int main() {
vector vec = {4, 5, 3, 2, 1, 43, 321};
// 1 升序
sort(vec.begin(), vec.end());
for (auto v : vec) {
cout << v << "\t";
}
cout << endl;
// 2 倒序
sort(vec.rbegin(), vec.rend());
for (auto v : vec) {
cout << v << "\t";
}
cout << endl;
//3 翻转 - 升序
reverse(vec.begin(), vec.end());
for (auto v : vec) {
cout << v << "\t";
}
cout << endl; // 4 匿名函数排序 - 倒序 sort(vec.begin(), vec.end(), [](int a, int b){return a>b;});
for (auto v : vec) {
cout << v << "\t";
}
cout << endl;
return 0;
}
6.2 map排序
由于sort函数对map类容器不生效,需要将map先转化为vec,使用sort对vec容器进行排序。int main() {
unordered_map map;
map[1] = 10;
map[2] = 13;
map[3] = 5;
vector> vec(map.begin(), map.end());
sort(vec.begin(), vec.end(), [](pair& a, pair& b) {
return a.second > b.second;
});
for (auto m : vec) {
cout << m.second << "\t";
}
cout << endl;
return 0;
}
参考文献
- cppplusplus: https://cplusplus.com/reference/
- cpprefence:https://en.cppreference.com/w/cpp