vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
Vector迭代器:
- begin+end: begin获取第一个位置的迭代器,end获取最后一个数据下一个位置的迭代器。
- rbegin+rend: rbegin获取最后一个位置的迭代器,rend获取第一个位置前一个位置的迭代器
如例:
void test1(vector<int> &vec)
{vector<int>::iterator it = vec.begin();while (it != vec.end()){cout << *it << endl;it++;}
}void test2(vector<int> &vec)
{vector<int>::reverse_iterator rit = vec.rbegin();while (rit != vec.rend()){cout << *rit << endl;rit++;}
}int main()
{vector<int>vec(4,10);vec.push_back(1);vec.push_back(2);vec.push_back(3);vec.push_back(4);test1(vec);test2(vec);system("pause");return 0;
}
Vector空间增长
size 获取数据个数
capacity 获取容量大小
empty 判断是否为空
resize 改变vector的size
reserve 改变vector放入capacity
如例:
void test(vector<int> &vec)
{cout << vec.size() << endl;//获取有效数据的大小cout << vec.capacity() << endl;//获取容量的大小cout << vec.empty() << endl;//检查空间是否为空vec.resize(5);//改变有效数据的大小为5vec.reserve(15);//改变空间的大小为15cout << vec.size() << endl;cout << vec.capacity() << endl;//打印数据vector<int>::iterator it = vec.begin();while (it != vec.end()){cout << *it << endl;it++;}vec.clear();//清空cout << vec.size() << endl;cout << vec.capacity() << endl;cout << vec.empty() << endl;
}
Vector的增删查改
push_back 尾插
pop_back 尾删
insert 在指定位置插入val
erase 删除指定位置的数据
swap 交换两个vector的数据空间
operator[] 像数组一样访问
如例:
vector<int>::iterator find(vector<int>::iterator begin, vector<int>::iterator end,int n)
{for (; begin != end&&n; begin++, n--);return begin;
}void test(vector<int> &vec)
{vec.push_back(5);//尾插一个数据5vec.pop_back();//从尾删除一个数据vector<int>::iterator pos = find(vec.begin(), vec.end(), 2);//查找第2个位置数据的迭代器并返回给posvec.insert(pos, 12);//在pos位置插入数据12vec.erase(pos);//删除pos位置的数据//新建一个vector容器v并插入数据vector<int> v;v.push_back(5);v.push_back(6);v.push_back(7);v.push_back(8);swap(v, vec);//交换v与vec的数据cout << vec.operator[](1)<<endl;//打印vec中位置为1处的数据
}
迭代器失效
插入数据迭代器失效
当在pos位置插入数据操作时,insert会使vector扩容,一旦扩容,pos指向的位置会被释放,故而无法对其访问。
Vector扩容并不是在原有的基础上增大空间,而是重新开辟一个合适大小的空间,在将原来vector中的数据移到新开辟的vector中,再将原来vector的释放掉。
如例:
vector<int>::iterator find(vector<int>::iterator begin, vector<int>::iterator end, int n)
{for (; begin != end&&n; begin++, n--);return begin;
}void test(vector<int> &vec)
{vec.push_back(1);vec.push_back(2);vec.push_back(3);vec.push_back(4);vec.push_back(5);cout << vec.size() << endl;cout << vec.capacity() << endl;vector<int>::iterator pos = find(vec.begin(), vec.end(), 3);vec.insert(pos, 11);cout << *pos << endl;//出错
}
删除指定位置数据迭代器失效
将pos位置的数据删除掉,即将该数据存放的空间时放掉,在对该位置进访问即为非法访问。
如例:
vector<int>::iterator find(vector<int>::iterator begin, vector<int>::iterator end, int n)
{for (; begin != end&&n; begin++, n--);return begin;
}void test(vector<int> &vec)
{vec.push_back(1);vec.push_back(2);vec.push_back(3);vec.push_back(4);vec.push_back(5);cout << vec.size() << endl;cout << vec.capacity() << endl;vector<int>::iterator pos = find(vec.begin(), vec.end(), 3);vec.erase(pos);cout << *pos << endl;//出错
}