C++学习笔记_15_容器
官方文档在这看
文章目录
C++学习笔记_15_容器容器的选取一、vector是什么?二、vector构造函数三、vector的遍历方式四、容量空间五、vector增删查改补充1.在通过迭代器拷贝的时候,类型必须一致2.vector < string >3.vector< char > vstr4.习题链接容器的选取
随机访问元素:Vector中间插入或删除:list、forword_list头尾插入删除,但不在中间插入删除:deque如果不确定,尽量使用Vecotr
一、vector是什么?
按照官方文档的话说,vector是可变大小数组的序列容器,可以理解成一个类似于数组的形式,可以采用下标对vector的元素进行访问,但又不是数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
二、vector构造函数
vector的构造有一下几种:
vector<int> v1;//无参vector<int> v2(10, 3);//10个val,val==3vector<int> v3(v2);//拷贝构造vector<int> v4(v3.begin(), v3.end());//迭代器vector<int> v5(12345678);//不算
测试代码如下:
cout << "v1 : ";vector<int> v1;//无参for (size_t i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;cout << "v2 : ";vector<int> v2(10, 3);//10个val,val==3for (size_t i = 0; i < v2.size(); i++){cout << v2[i] << " ";}cout << endl;cout << "v3 : ";vector<int> v3(v2);for (size_t i = 0; i < v3.size(); i++){cout << v3[i] << " ";}cout << endl;cout << "v4 : ";vector<int> v4(v3.begin(), v3.end());for (size_t i = 0; i < v4.size(); i++){cout << v4[i] << " ";}cout << endl;//12个0cout << "v5 : ";vector<int> v5(12);for (size_t i = 0; i < v5.size(); i++){cout << v5[i] << " ";}cout << endl;
结果:
所以v5的方式不符合正常逻辑,因此不属于正常构造方式。
三、vector的遍历方式
与string类似:
for+operator[],在上面构造的时候已经使用过。迭代器
vector<int> v2(10, 3);vector<int>::iterator it2 = v2.begin();while (it2 != v2.end()){cout << *it2 << " ";++it2;}cout << endl;
3. 范围for
vector<int> v2(10, 3);for (auto v : v2)cout << v << " ";
代码简单,结果与前面一样。
推荐熟悉了以后,多用auto遍历。
四、容量空间
size返回数据个数capacity返回容量大小resize修改size大小reserve改变vector放入capacityempty判断是否为空通过代码测试用法:
vector<int> v1(10,2);cout << "v1.size() = " << v1.size() << endl;cout << "v1.capacity() = " << v1.capacity()<< endl;v1.resize(5);cout << "v1.size() = " << v1.size() << endl;cout << "v1.capacity() = " << v1.capacity()<< endl;v1.reserve(15);cout << "v1.size() = " << v1.size() << endl;cout << "v1.capacity() = " << v1.capacity()<< endl;cout<<v1.empty()<<endl;
开10个空间,每个放入2,此时size、capacity都是10;resize之后,size改变,capacity不变;reserve之后,size不变,capacity改变;
结果:
小测试说明vector的容量变化:
size_t sz;std::vector<int> v;sz = v.capacity();std::cout << "making v grow:\n";for (int i = 0; i < 100; ++i) {v.push_back(i);if (sz != v.capacity()) {sz = v.capacity();std::cout << "capacity changed: " << sz << '\n';}}return 0;
证明在VS中约1.5倍扩容,g++中约2倍
五、vector增删查改
push_back 尾插pop_back 尾删find 查找insert 在pos之前插入valerase 删除pos上的valswap 交换数据空间operator[] 像数组一样访问测试代码:
int main(){vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);v.push_back(6);v.push_back(7);v.push_back(8);for (auto s : v){cout << s << " ";}cout << endl;v.pop_back();v.pop_back();for (auto s : v){cout << s << " ";}cout << endl;vector<int>::iterator pos = find(v.begin(), v.end(), 3);v.insert(pos, 9);vector<int>::iterator it = v.begin();while (it != v.end()) {cout << *it << " ";++it;}cout << endl;pos = find(v.begin(), v.end(), 4);// 删除pos位置的数据v.erase(pos);it = v.begin();while (it != v.end()) {cout << *it << " ";++it;}cout << endl;return 0;}
补充
1.在通过迭代器拷贝的时候,类型必须一致
list<int> lt(5, 3);vector<int> v4(lt.begin(), lt.end());
2.vector < string >
为什么使用&(引用)和const
vector<string> v;v.push_back("kris");v.push_back("zgz");///for (auto s : v){cout << s << " ";}cout << endl;*///不断存在深拷贝//解决for (const auto & s : v){cout << s << " ";}cout << endl;vector<vector<string>> vv;//在这体现更明显
3.vector< char > vstr
vector<char> vstr;string str;
区别:
string更好配合,如:strcpy(buff, str.c_str());支持:+=、 比较大小等
4.习题链接
1.只出现一次的数字
2.杨辉三角