1.vector创建对象:
vector<int> v1;
2.在末尾增加数据:push_back:
push_back( const T& value );
v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4);
3.删除末尾数据:pop_back:
pop_back();
vector<int> numbers; numbers.push_back(5); numbers.push_back(3); numbers.push_back(4); numbers.pop_back(); print(numbers); [ 5 3 4 ] [ 5 3 ]
4.vector大小:size():
size_type size() const;
vector<int> nums {1, 3, 5, 7}; cout << "nums contains " << nums.size() << " elements.\n"; 4
5.插入数据:insert:
insert( const_iterator pos, const T& value );
v.insert(v.begin(), 0); v.insert(v.begin(), -1); for (auto e : v) { cout << e << " "; } cout << endl;
6.删除数据:erase:
erase( iterator pos );
v.erase(v.begin()); for (auto e : v) { cout << e << " "; } cout << endl;
7.调整大小:resize:
void resize( size_type count );
void resize( size_type count, const value_type& value );
调整容器的大小以包含计数元素,如果计数 == size().
如果当前大小大于计数,容器被减少到它的第一个计数元素。
如果当前大小小于计数,
1)附加其他默认插入的元素。2)其他副本价值被附加。std::vector<int> c = {1, 2, 3}; print("The vector holds: ", c); c.resize(5); print("After resize up to 5: ", c); c.resize(2); print("After resize down to 2: ", c); c.resize(6, 4); print("After resize up to 6 (initializer = 4): ", c); The vector holds: 1 2 3 After resize up to 5: 1 2 3 0 0 After resize down to 2: 1 2 After resize up to 6 (initializer = 4): 1 2 4 4 4 4
8.查找数据:
vector<int>::iterator pos = find(v.begin(), v.end(), 5);
9.迭代器:iterator:三种类型迭代器,本质上就是指针
1.普通正向迭代器 可读可写
vector<int>::iterator it = v.begin(); while (it != v.end()) { cout << *it << " "; ++it; } cout << endl; Print_vector(v);
2.reverse(逆置)反向迭代器:reverse_iterator:
vector<int>::reverse_iterator rit = v.rbegin(); while (rit != v.rend()) { cout << *rit << " "; ++rit; } cout << endl;
3.正向只读迭代器:const_iterator
vector<int>::const_iterator it = vt.begin(); while (it != vt.end()) { cout << *it << " "; ++it; } cout << endl;
10.遍历修改数据:
1.operator[]+sizefor (size_t i = 0; i < v.size(); i++) { v[i] *= 2; cout << v[i] << " "; } cout << endl;
2.(正向)迭代器:iterator
vector<int>::iterator it = v.begin(); while (it != v.end()) { cout << *it << " "; ++it; } cout << endl;
3.范围for:底层是被编译器替换成迭代器方式遍历支持
for (auto e : v1) { cout << e << " "; } cout << endl;
10.迭代器失效:
1.在迭代器后面继续push_back元素。
//这种迭代器失效的解决方法只能是在迭代器前面push_back,否则就出问题 void test_vector8() { vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); vector<int>::iterator it = v.begin(); v.push_back(6); v.push_back(7); while (it != v.end()) { cout << *it << " "; ++it; } cout << endl; }
2.迭代器位置不对。
//迭代器失效 void test_vector9() { 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); //要求删除容器中的所有偶数 vector<int>::iterator it = v.begin(); while (it != v.end()) { if (*it % 2 == 0) { //v.erase(it);//删除it之后,it就失效了,这里的失效是it的位置不对了,再++it就不行,vs下报错了,是编译检查的,一定报错 //gcc下面没有进行严格的检查,可能会报错,可能会正常运行,也有可能有个别偶数没有被删除调 it = v.erase(it);//erase会返回删除的it的下一个位置的迭代器,这种才不会失效 } ++it; } for (auto e : v) { cout << e << " "; } cout << endl; //总结:不管哪个平台,earse(it)之后,it就失效了,只是导致的结果不一样而已,总之有各种各样的问题 }