vector<type> name; 空vector
name.reserve(n) 预留n的空间
name.assign(v2,v2.begin(),v2.end()) 赋值
vector<type> name {2, 3, 5, 7, 11, 13, 17, 19}; 非空vector
vector<type> name(number)指定大小vector
vector<type> name(number,initial) 指定number大小,所有值为initial的vector
vector<vector<type>> name(n) name[i] = vector<type>(n,initial) 二维数组
vector<vector<type>> name(m,vector<int>(n,1)); 二维数组

1 vector - 图1

访问vector

  1. vector<int> nums{1, 2, 3, 4, 5};
  2. # 访问首元素
  3. cout << "nums[0] "<< nums[0] << endl;
  4. # nums[0] 1

nums.data() 返回首元素的指针

  1. cout << "nums[0] "<< *nums.data() << endl;
  2. # nums[0] 1

at() 索引

容器名[n]这种获取元素的方式,需要确保下标 n 的值不会超过容器的容量(可以通过 capacity()成员函数获取),否则会发生越界访问的错误。幸运的是,和 array 容器一样,vector 容器也提供了at() 成员函数,当传给 at() 的索引会造成越界时,会抛出std::out_of_range异常。

  1. //修改容器中下标为 0 的元素的值
  2. values.at(0) = values.at(1) + values.at(2) + values.at(3) + values.at(4);

front() 和 back(),它们分别返回 vector 容器中第一个和最后一个元素的引用,通过利用这 2 个函数返回的引用,可以访问(甚至修改)容器中的首尾元素。

取最后一个元素

  1. vector<int> vectorT;
  2. vector::iterator pt = vectorT.end()-1;
  3. // end()是最后一个元素的下一个位置
  4. vectorT.back();
  5. //
  6. vectorT.at(vectorT.size()-1);
  7. vectorT.rbegin();
  8. // 倒序遍历
  9. cout<< *(vectorT.rbegin()++)<<endl;
  10. 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填充