一。Vector的增删查找
(1)push_back() / pop_back();
下来我们看一下的代码:
int main()
{
int a[] = { 1, 2, 3, 4, 5 };
vector<int> v(a, a + sizeof(a) / sizeof(int));
vector<int>::iterator it = v.begin();
while (it != v.end())
{
cout << *it << " ";
it++;
}
cout << endl;
v.pop_back();
v.pop_back();
it = v.begin();
while (it != v.end())
{
cout << *it << " ";
it++;
}
cout << endl;
return 0;
}
下面我们就看一下程序执行的代码:
(2)find / insert / erase
我们看下面的一段代码,来理解其中的意思:
int main()
{
int a[] = { 1, 2, 3, 4, 5 };
vector<int> v(a, a + sizeof(a) / sizeof(int));
vector<int>::iterator pos = find(v.begin(), v.end(), 3);
v.insert(pos ,30);
vector<int>::iterator it = v.begin();
while (it != v.end())
{
cout << *it << " ";
it++;
}
cout << endl;
pos = find(v.begin(), v.end(), 3);
v.erase(pos);
vector<int>::iterator ite = v.begin();
while (ite != v.end())
{
cout << *ite << " ";
++ite;
}
return 0;
}
(3) operator[] 和 for+auto
// operator[]+index 和 C++11中vector的新式for+auto的遍历
// vector使用这两种遍历方式是比较便捷的。
我们看一下下面实现的代码:
int main()
{
int a[] = { 1, 2, 3, 4, 5 };
vector<int> v(a, a + sizeof(a) / sizeof(int));
v[0] = 10;
cout << v[0] << endl;
for (size_t i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
vector<int> swapv;
swapv.swap(v);
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
cout << "v data";
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
cout << "swapv data";
for (auto x : v) //使用的是for+auto的方式
{
cout << x<<" ";
}
cout << "swapv data";
cout << endl;
return 0;
}
二。迭代器失效的问题
(1)insert / erase 导致迭代器失效;
我们先看下面一段代码:
int main()
{
int a[] = { 1, 2, 3, 4, 5 };
vector<int> v(a, a + sizeof(a) / sizeof(int));
vector<int>::iterator pos = find(v.begin(), v.end(), 3);
//回答一
v.erase(pos);
cout << *pos << endl;
//回答二
pos = find(v.begin(), v.end(), 3);
v.insert(pos,30);
cout << *pos << endl;
return 0;
}
我们看一下程序运行的结果:
由执行程序,我们可以看出,程序出现了崩溃,为什么崩溃,下来我们就分析一下:
回答一:删除pos位置的数据,导致pos迭代器失效;
回答二:insert会导致迭代器失效,是因为insert可能会导致增容,增容后pos还指向原来的空间,而原来的空间已经释放了。
两者是相互存在,相互制约的,所以我们在使用的时候,一定要先插入数据,然后在释放此处的数据;
(2)常见的迭代器失效的场景
现在我们实现一个删除2的倍数的值,来看一下代码的实现;
int main()
{
int a[] = { 1, 2, 3, 4 };
vector<int> v(a, a + sizeof(a) / sizeof(int));
vector<int>::iterator it = v.begin();
while (it != v.end())
{
if (*it % 2 == 0)
{
v.erase(it);
++it;
}
cout << endl;
}
return 0;
}
我们执行下面的一段程序,程序直接就崩溃了,那是因为如果是偶数,erase导致it失效。对失效的迭代器进行++it,会导致程序崩溃
那么如何改进呢?根据它失效的特性,我们由失效的特性来解决;
下来我们看下面修改后的代码:
int main()
{
int a[] = { 1, 2, 3, 4 };
vector<int> v(a, a + sizeof(a) / sizeof(int));
vector<int>::iterator it = v.begin();
while (it != v.end())
{
if (*it % 2 == 0)
it = v.erase(it); //这里我不要在后面加加,等于偶数的时候,我们已近释放了那块空间,
//改成这样, erase会返回删除位置的下一个位置
else
it++;
}
cout << endl;
return 0;
}
看完了这篇博客相信大家对vector也有了一定的认识,下来之后,我们查看文档,多实现一下其他的接口,感觉可以的话,我们互相关注一下。