vector<type> name; 空vectorname.reserve(n) 预留n的空间name.assign(v2,v2.begin(),v2.end()) 赋值vector<type> name {2, 3, 5, 7, 11, 13, 17, 19}; 非空vectorvector<type> name(number)指定大小vectorvector<type> name(number,initial) 指定number大小,所有值为initial的vectorvector<vector<type>> name(n) name[i] = vector<type>(n,initial) 二维数组vector<vector<type>> name(m,vector<int>(n,1)); 二维数组
访问vector
vector<int> nums{1, 2, 3, 4, 5};# 访问首元素cout << "nums[0] "<< nums[0] << endl;# nums[0] 1
nums.data() 返回首元素的指针
cout << "nums[0] "<< *nums.data() << endl;# nums[0] 1
at() 索引
容器名[n]这种获取元素的方式,需要确保下标 n 的值不会超过容器的容量(可以通过 capacity()成员函数获取),否则会发生越界访问的错误。幸运的是,和 array 容器一样,vector 容器也提供了at() 成员函数,当传给 at() 的索引会造成越界时,会抛出std::out_of_range异常。
//修改容器中下标为 0 的元素的值values.at(0) = values.at(1) + values.at(2) + values.at(3) + values.at(4);
front() 和 back(),它们分别返回 vector 容器中第一个和最后一个元素的引用,通过利用这 2 个函数返回的引用,可以访问(甚至修改)容器中的首尾元素。
取最后一个元素
vector<int> vectorT;vector::iterator pt = vectorT.end()-1;// end()是最后一个元素的下一个位置vectorT.back();//vectorT.at(vectorT.size()-1);vectorT.rbegin();// 倒序遍历cout<< *(vectorT.rbegin()++)<<endl;cout<< *(pt--)<<endl;
访问vector多个元素
size()实际存储元素个数 capacity() 容器总容量
vector 容器的容量(用 capacity 表示),指的是在不分配更多内存的情况下,容器可以保存的最多元素个数;而 vector 容器的大小(用 size 表示),指的是它实际所包含的元素个数。
for (int i = 0; i < values.size(); i++)
{
values[i];
}
for (auto&& value : values)
{
cout << value << " ";
}
for (auto first = values.begin(); first < values.end(); ++first) {
cout << *first << " ";
}
vector迭代器 遍历
vector<int>::iterator start = values.begin(); 第一个元素vector<int>::iterator end=values.end(); 最后元素的下一位vector<int>::reverse_iterator start = values.rbegin()倒序迭代器
while(start!=end)
{
cout<<*start++<<endl;
}
for(vector<int>::iterator i=values.begin();i!=values.end();i++)
{
cout<<*i<<endl;
}
#include<algorithm>
void func(int val)
{
cout << val << endl;
}
for_each(values.begin(),values.end(),func())
auto最好写成const auto&...不会有拷贝开销...for(const auto& item:list){}
for (auto it = list.begin(); it != list.end(); ++it)
{
}
for_each(auto item in list)
{
//item是list每个元素的值
}
for (auto item : list)
{
//item是list每个元素的值
}
for (auto& item:list){}可修改list
for (auto&& item:vector<bool> list)
重点 使用for(auto x:vector<bool>)时得到一个proxy class,操作时会改变vector本身元素。改为:for(bool x:vector<bool>)
重点:当vector<bool>返回临时对象,使用auto&会编译错误,临时对象不能绑在non-const l-value reference (左值引用)需使用auto&&,初始化右值时也可捕获
vector添加元素
push_back() 尾部添加元素 emplace_back() 尾部添加元素
values.push_back(1);
values.emplace_back(2);
emplace_back()和push_back()的区别
push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。
insert()在 vector 容器的指定位置插入一个或多个元素
| 语法格式 | 用法说明 |
|---|---|
| iterator insert(pos,elem) | 在迭代器 pos 指定的位置之前插入一个新元素elem,并返回表示新插入元素位置的迭代器。 |
| iterator insert(pos,n,elem) | 在迭代器 pos 指定的位置之前插入 n 个元素 elem,并返回表示第一个新插入元素位置的迭代器。 |
| iterator insert(pos,first,last) | 在迭代器 pos 指定的位置之前,插入其他容器(不仅限于vector)中位于 [first,last) 区域的所有元素,并返回表示第一个新插入元素位置的迭代器。 |
| iterator insert(pos,initlist) | 在迭代器 pos 指定的位置之前,插入初始化列表(用大括号{}括起来的多个元素,中间有逗号隔开)中所有的元素,并返回表示第一个新插入元素位置的迭代器。 |
vector<int> demo{1,2};
//第一种格式用法
demo.insert(demo.begin() + 1, 3);//{1,3,2}
//第二种格式用法
demo.insert(demo.end(), 2, 5);//{1,3,2,5,5}
//第三种格式用法
array<int,3>test{ 7,8,9 };
demo.insert(demo.end(), test.begin(), test.end());//{1,3,2,5,5,7,8,9}
//第四种格式用法
demo.insert(demo.end(), { 10,11 });//{1,3,2,5,5,7,8,9,10,11}
emplace() 在 vector 容器指定位置之前插入一个新的元素。效率高
iterator emplace (const_iterator pos, args...);
demo1.emplace(demo1.begin(), 3); // {3 1 2}
vector删除元素
| 函数 | 功能 |
|---|---|
| pop_back() | 删除 vector 容器中最后一个元素,该容器的大小(size)会减 1,但容量(capacity)不会发生改变。 |
| erase(pos) | 删除 vector 容器中 pos 迭代器指定位置处的元素,并返回指向被删除元素下一个位置元素的迭代器。该容器的大小(size)会减 1,但容量(capacity)不会发生改变。 |
| swap(beg)、pop_back() | 先调用 swap() 函数交换要删除的目标元素和容器最后一个元素的位置,然后使用 pop_back() 删除该目标元素。 |
| erase(beg,end) | 删除 vector 容器中位于迭代器 [beg,end)指定区域内的所有元素,并返回指向被删除区域下一个位置元素的迭代器。该容器的大小(size)会减小,但容量(capacity)不会发生改变。 |
| remove() | 删除容器中所有和指定元素值相等的元素,并返回指向最后一个元素下一个位置的迭代器。值得一提的是,调用该函数不会改变容器的大小和容量。 |
| clear() | 删除 vector 容器中所有的元素,使其变成空的 vector 容器。该函数会改变 vector 的大小(变为 0),但不是改变其容量。 |
pop_back()
demo.pop_back();
erase(const_iterator pos) 会返回一个指向删除元素所在位置下一个位置的迭代器。
vector<int>demo{ 1,2,3,4,5 };
auto iter = demo.erase(demo.begin() + 1);//删除元素 第二个位置的元素
cout << endl << *iter << endl; // 3
swap(beg)+pop_back() v1.swap(v2) or swap(a,b)
swap(*(begin(demo)+1),*(end(demo)-1));
demo.pop_back();
erase(const_iterator beg, const_iterator end) 返回指向此区域之后一个位置的迭代器。
auto iter = demo.erase(demo.begin()+1, demo.end() - 2);
cout << endl << *iter << endl; // 3
remove() 不改变size
#include<algorithm>
auto iter = remove(demo.begin(), demo.end(), 3);
demo.erase(iter,demo.end())
clear()
vector容量和大小
empty() // 判断空
capacity() // 容器容量
size(); 容器已有元素个数
resize(int num); // 重新定义容器大小,默认值填充
resize(int num,elem); // elem填充
