STL六大组件:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
Vector所采用的数据结构非常简单,线性连续空间,它以两个迭代器_Myfirst和_Mylast分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器_Myend指向整块连续内存空间的尾端。
为了降低空间配置时的速度成本,vector实际配置的大小可能比客户端需求大一些,以备将来可能的扩充,这边是容量的概念。换句话说,一个vector的容量永远大于或等于其大小,一旦容量等于大小,便是满载,下次再有新增元素,整个vector容器就得另觅居所。
注意:
所谓动态增加大小,并不是在原空间之后续接新空间(因为无法保证原空间之后尚有可配置的空间),而是一块更大的内存空间,然后将原数据拷贝新空间,并释放原空间。因此,对vector的任何操作,一旦引起空间的重新配置,指向原vector的所有迭代器就都失效了。这是程序员容易犯的一个错误,务必小心。 |
常用方法
v.begin();
v.end();
v.push_back(value);
v.pop_back();
v.capacity();
v.assign(v1.begin(),v1.end());
v.empty();
v.front();
v.back();
v.resize(num);
v.swap(v1);
v.clear();
v.erase(v.begin);
#include<iostream> #include<string> #include<vector> #include<list> using namespace std; void printVector(vector<int> v) { for (vector<int>::iterator i = v.begin(); i != v.end(); ++i) { cout << *i <<" "; } cout << "\n"; } void test01() { vector<int> v1; for (int i = 0; i < 10; i++) { v1.push_back(i + 1); cout << v1.capacity() << " "; } cout << "\n"; printVector(v1); vector<int> v2(v1.begin(),v1.end()); printVector(v2); vector<int> v3; v3.assign(v1.begin(),v1.end()); printVector(v3); vector<int>v4(10, 100); printVector(v4); v3.swap(v4); printVector(v3); printVector(v4); } void test02() { vector<int> v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); //v1.resize(10); printVector(v1); cout << v1.empty() << endl; cout << "第一个" << v1.front() << endl; cout << "最后一个" << v1.back() << endl; v1.pop_back(); printVector(v1); v1.clear(); cout << v1.empty() << endl; v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); v1.push_back(5); v1.erase(v1.begin()); printVector(v1); v1.erase(v1.begin(), v1.end()); cout << v1.empty() << endl; } //内存压缩 void test03() { vector<int> v1; for (int i = 0; i < 10000; i++) { v1.push_back(i + 1); } cout << v1.capacity() << endl; cout << v1.size() << endl; v1.resize(10000); vector<int>(v1).swap(v1); cout << v1.capacity() << endl; cout << v1.size() << endl; } //内存预留 void test04() { vector<int> v1; v1.reserve(10000); int* p = NULL; int num = 0; for (int i = 0; i < 10000; i++) { v1.push_back(i + 1); if (p!=&v1[0]) { p = &v1[0]; num++; } } cout << v1.capacity() << endl; cout << v1.size() << endl; cout << "num=" << num << endl; } void test05() { vector<int> v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); //逆序遍历 for (vector<int>::reverse_iterator i = v1.rbegin(); i != v1.rend(); i++) { cout << *i << endl; } vector<int>::iterator num = v1.begin()+3; cout << *num << endl; list<int> l1; l1.push_back(1); l1.push_back(2); l1.push_back(3); l1.push_back(4); list<int>::iterator i = l1.begin(); i++; cout << *i << endl; } int main() { test01(); test02(); test03(); test04(); test05(); system("pause"); return EXIT_SUCCESS; }