vector<string>和vector<int>

vector简要介绍
vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

vector是字符串容器
比如vector s[2]
这句话的意思就是定义了一个字符串容器,里面可以存放2个字符串

而且string只是定义一个字符串。

类似的还有vector
例如

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.csdn.net/cmy1130/article/details/88971585

你可能感兴趣的:(leetcode,c++,算法)