vector 底层实现的方式为一个顺序表 容量按照vs每次1.5倍的增张,gcc为2倍实现不同那么增长方式就不同
vector的构造方式
vector<int> ar1{ 1,2,3,4,5,6,7,8,9 };
vector<int> ar2(ar1.begin(), ar1.end());
vector<int> ar3(10, 1);
vector<int> ar4(ar2); //深拷贝
Printf(ar2);
Printf(ar3);
三种构造方式,第二个使用迭代器构造,将ar3初始化为10个1;
打印结果如下:

迭代器的使用 iterator
iterator由于比较复杂在C++11中使用auto关键字定义就行。
1)begin()返回的是第一个元素的地址
2)end()返回的是最后一个元素的下一个元素的位置(无效值)
3)rbegin()返回的是最后一个元素的位置
4)rend()返回的是第一个元素的前一个元素的位置(无效值)
5)对rbegin++相当于往后走,对rend++相当于往前走;
void TestIterator1()
{
vector<int> ar1{ 1,2,3,4,5,6,7,8,9 };
auto vi1 = ar1.begin();
auto vi2 = ar1.end();
auto vi3 = ar1.rbegin();
auto vi4 = ar1.rend();
cout << *vi1 << endl;
cout << *vi2 << endl;
cout << *vi3 << endl;
cout << *vi4 << endl;
}

vector的增删查改
1)reserve 改变容量的大小
2)resize 改变有效值的个数,如果大于写了val则将多得值初始化为val,如果不写默认为0;
3)push_back 在末尾插一个元素,如果本来就每元素那么在debug下 会报错,最好还是判断一下;
4)pop_back 尾删,没啥说的
5)insert 在一个元素之前插另一个元素(见迭代器失效)
void Testalter()
{
vector<int> ar1{ 1,2,3,4,5,6,7,8,9 };
cout << ar1.capacity() << endl;
ar1.reserve(40);
cout << ar1.capacity()<<endl;
cout << ar1.size() << endl;
ar1.resize(20);
cout << ar1.size() << endl;
Printf(ar1);
cout << endl;
ar1.resize(50, 99);
Printf(ar1);
}

迭代器的失效
当迭代器所在的元素被删除,原空间发生变化的时候就会发生迭代器的失效
下面的源码稍微复杂但是很简单!
void ittset() {
vector<int> v = { 1,2,3,4,5,6,7,8,9 };
vector<int> v1 = {99,99,99};
auto vi = v.begin() + 1;
vector<int>::iterator pos = find(v.begin(), v.end(), 3);
v.erase(pos); //此时迭代器失效
cout << *pos << endl; //bebug下会崩溃但是在rel版本下可以打出来,因为rel下没有内存检测
cout << *vi<<endl;
vi = v.erase(vi); //但是可以获取erase的返回值,如果获取的了那么得到的是vi原来位置元素的值
cout << *vi << endl;
vi=v.insert(v.begin() + 1, v1.begin(), v1.end());//获取vi现在的位置
cout << *vi++ << endl;
cout << *vi++ << endl;
cout << ++*vi << endl;
//insdert 和 erase 都会导致迭代器失效 那么可以获取其的返回值,获取的返回值为操作之后的位置。
}
rel下打出的值
可以看见*vi在获取到返回值后可以继续使用。获取的返回值为新空间相对于的返回值

2449

被折叠的 条评论
为什么被折叠?



