在VS下执行这段代码:
1. void test_vector3() 2. { 3. size_t sz; 4. std::vector<int> foo; 5. sz = foo.capacity(); 6. 7. std::cout << "making foo grow:\n"; 8. 9. for (int i = 0; i < 100; i++) 10. { 11. foo.push_back(i); 12. if (sz != foo.capacity()) 13. { 14. sz = foo.capacity(); 15. std::cout << "capacity changed:" << sz << endl; 16. } 17. } 18. }
发现增容的过程是大概按照1.5倍增容的
同样的代码在linux下运行,发现是2倍增容的
因此 ,在不同的编译器下增容机制不同。
1. void reserve (size_type n);//开辟n个元素空间 2. void resize (size_type n, value_type val = value_type());//开辟n个元素空间,并将每个元素默认初始化为val
如果加上reserve(),那么会提前知道要开多少空间,就提前开好了,避免后面再开空间
1. void test_vector3() 2. { 3. size_t sz; 4. std::vector<int> foo; 5. sz = foo.capacity(); 6. foo.reserve(100); 7. 8. std::cout << "making foo grow:\n"; 9. 10. for (int i = 0; i < 100; i++) 11. { 12. foo.push_back(i); 13. if (sz != foo.capacity()) 14. { 15. sz = foo.capacity(); 16. std::cout << "capacity changed:" << sz << endl; 17. } 18. } 19. }
linux下运行也是同样结果 ,也是提前知道要开100个字节的空间,就提前开好了
监视如下代码发现,reserve()之后,capacity变了,但是size没变;resize()之后,capacity变了,size也变了,且每个元素都被默认赋值为0
1. vector<int> v1; 2. v1.reserve(10); 3. 4. vector<int> v2; 5. v2.resize(10);
返回vector元素个数
size_type size() const;
求v5的size()
1. vector<int> v5; 2. //插入4个元素 3. v5.push_back(1.1); 4. v5.push_back(2.2); 5. v5.push_back(3.3); 6. v5.push_back(4.4); 7. cout << v5.size() << endl;
判断vector是否为空,为空返回1,不为空返回0
bool empty() const;
判断v5是否为空
cout << v5.empty() << endl;
1. void push_back (const value_type& val);//尾插元素 2. void pop_back();//尾删元素
向v5尾插元素和尾删元素
1. v5.push_back(5.5); 2. PrintVector(v5); 3. 4. v5.pop_back(); 5. PrintVector(v5);
1. iterator insert (iterator position, const value_type& val);//插入val到position位置 2. void insert (iterator position, size_type n, const value_type& val);//将n个val插入到position位置 3. template <class InputIterator> 4. void insert (iterator position, InputIterator first, InputIterator last);//将值为InputIterator的first到last之间的元素插入到position位置
1. vector<double> v5; 2. //插入4个float元素 3. v5.push_back(1.1); 4. v5.push_back(2.2); 5. v5.push_back(3.3); 6. v5.push_back(4.4); 7. v5.push_back(5.5); 8. 9. v5.insert(v5.end(), 6.6);//在v5末尾插入6.6 10. PrintVector(v5); 11. 12. v5.insert(v5.begin(), 2,0);//在v5开头插入2个0 13. PrintVector(v5); 14. 15. vector<double> v6; 16. v6.push_back(7.7); 17. v6.push_back(8.8); 18. 19. v5.insert(v5.begin(), v6.begin(),v6.end());//在v5开头插入v6 20. PrintVector(v5);
1. iterator erase (iterator position);//删除某一位置元素 2. iterator erase (iterator first, iterator last);//删除迭代器first和last之间的元素
1. v5.erase(v5.begin());//删除v5开头元素 2. PrintVector(v5); 3. 4. v5.erase(v5.begin(), v5.begin()+2);//从v5开头删除2个元素 5. PrintVector(v5);
insert()和erase()之后需要挪动元素,时间复杂度为O(N),效率较低,不推荐用insert()和erase()插入删除元素
在迭代器区间内查找元素,find函数实现在algorithm中,可以给所有容器使用,因此要使用find函数,就要include<algorithm>
1. template <class InputIterator, class T> 2. InputIterator find (InputIterator first, InputIterator last, const T& val);//在InputIterator迭代器first和last区间内查找val元素的位置
注意:迭代器区间是左闭右开,因此能取到第一个位置,但取不到最后一个位置
1. vector<double>::iterator pos = find(v5.begin(), v5.begin() + 3, 1.1);//在第一个元素和第四个元素(左闭右开,不包含第四个元素)之间查找值为1.1的元素位置 2. v5.erase(pos);//删除1.1位置的元素,即删除1.1 3. 4. PrintVector(v5);
将this指针指向的对象的内容和x进行交换
void swap (vector& x);
如:
1. vector<int> v1; 2. v1.push_back(20); 3. 4. v.swap(v1);//交换v和v1的元素 5. 6. PrintVector(v); 7. PrintVector(v1);
vector自己实现了swap(),相比较,库里的swap需要3次深拷贝,代价比较高:
1. template <class T> void swap (T& a, T& b); 2. { 3. T c(a); a=b; b=c; 4. }











