vector简要介绍
vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
vector<string>
是字符串容器
比如vector<string> s[2]
这句话的意思就是定义了一个字符串容器,里面可以存放2个字符串
而且string只是定义一个字符串。
类似的还有vector<int>
例如
vector<int> nums;
vector<int> nums(n);
nums.push_back(1); //直接从数组末端添加数据
nums[i]=1;
nums.pop_back(); //删除最后一个元素;
sort(nums.begin(),nums.end()); // 排序
reverse(nums.begin(), nums.end()); //翻转
nums.resize(nums.size-i); //直接将数组长度减小,某种方式上删掉了后面i个
还可以通过vector创建二维数组
vector<vector <int> > nums(m ,vector<int>(n)); //m*n的二维vector
定义了一个vector容器,元素类型为vector,初始化为包含m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。
vector(n)表示构造一个无名且含n个0的vector对象。
创建动态的二维数组
方法一
vector<vector <int> > nums;
nums.resize(m);
for(int i=0;i<m;i++) nums[i].resize(n);
方法二
vector<vector <int> > nums;
nums.resize(m,vector<int>(n));
获得二维数组的行数:nums.size();
获得二维数组的列数:nums[0].size()
下面介绍一下如何删除vector中的元素,以nums为例:
比如,有一个vector nums = {1, 2, 2, 2, 2, 3, 5},要求删除nums中所有值为2的元素。
下面先给一个错误示范:
for (vector::iterator it = nums.begin(); it != nums.end(); it++) {
if (*it == 2) {
nums.erase(it);
}
}
为什么说这是错误的呢?可以自己试一下,这么写的话输出结果是错误的,因为迭代器失效导致的:
在第一个2被erase之后,it的迭代器就已经失效了,用它来继续遍历vector就会漏掉被删除元素后面的第一个元素,导致2没有被完全清除。可以这么理解,删除本元素之后,剩下的都会往前进一个,但是这样迭代器就会漏掉当前位置的直接进行it++。
有两种方法
for (vector::iterator it = nums.begin(); it != nums.end();) {
if (*it == 2) {
nums.erase(it);
it = nums.begin();
} else {
++it;
}
}
这种方法是在每次迭代器失效之后,重置迭代器为begin,但是这样的话每删除一个元素,就要从头开始遍历,本来O(n)时间可以搞定的事情,现在却需要O(n^2)时间。所以往下看第二种方法。
for (vector::iterator it = nums.begin(); it != nums.end();) {
if (*it == 2) {
it = nums.erase(it);
} else {
++it;
}
}
这种方法,每次erase一个元素之后直接返回it继续遍历就可以了。
类似的还有
nums.insert() //向数组中插入元素。
参考:
https://www.coonote.com/cplusplus-note/vector-delete-element.html
https://blog.youkuaiyun.com/cmy1130/article/details/88971585