基本语法

创建容器

定义:vector<int> nvec;

定义并初始化100个0:vector<int> nvec(100,0);

定义长度为100:vector<int> nvec(100);

定义vec2为vec1的复制:vector<int> nvec2(nvec1); vector<int> nvec2=nvec1;

定义并一一初始化值:vector<int> nvec={1,2,3}; vector<int>nvec{1,2,3};

用数组+vector的方式定义二维数组:vector<int> nvec[100]; *

用vector的方式定义二维数组:vector<vector<int>> nvec( 100, vector<int>(100) ) *

* 两种创建二维数组的方式图示:Nlink.picture

容器的赋值与取用

常规赋值与取用

int a=nvec[0];

nvec[0]=a;

弊端:对于越界的访问不会报错。可用下文章节 #使用引用的方式 进行访问。

对于特定位置

获取容器第0个与最后一个的值:

a=nvec.front(); a=nvec.back();

不能混淆front()begin()back()end()。此处front()back是返回容器位置的值,如int a,可以进行读写;而begin()end()是返回容器的某个迭代器*。

* 迭代器见下文章节 #迭代器

使用引用的方式

把第2位的值改为0:nvec.at(2)=0; int & a = nvec.at(2); a = 0;

优点:越界访问会停止运行,终端显示如下:

terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check: __n (which is 9) >= this->size() (which is 5)

--------------------------------
Process exited after 1.97 seconds with return value 3 (0 ms cpu time, 5052 KB mem used).

两容器的交换

nvec1.swap(nvec2); nvec2.swap(nvec1);

容器交换后,两容器的容量会发生交换。是少有的可能实现容器容量减小的函数*。

* 有关容器的容量可参考下文章节 #容器的长度与容量

容器的长度与容量

将容器的长度设置为10,用0补全不足的位置,或删去多余的位置:nvec.resize(10,0);

获取容器的长度:inta=nvec.size();

容器是否为空:boola=nvec.empty();

获取容器的容量:inta=nvec.capacity();

更改容器的容量为10,只增不减:nvec.reserve(10);

删去容器多余的容量:nvec.shrink_to_fit();

获取容器支持的最长长度:inta=nvec.max_size();

(大多数语法都不会减小容器的容量)。

更改元素

插入元素10到尾部:nvec.push_back(10);

删除尾部1个元素:nvec.pop_back;

删除第0位元素并且移动后面所有元素:nvec.erase(0);

同上,但含头不含尾:nvec.erase(0,3);

清空所有元素:nvec.clear;

place处插入(原来place即以后向后移)元素10:nvec.insert(place,10);

同上,插入2个:nvec.insert(place,n,10);

同上,插入的是其他容器的迭代器:nvec.insert(place,iterInNvec0_1,iterInNvec0_2);

翻转整个容器:reverse(nvec.begin(),nvec.end());。需注意此处reverse与下文章节 #特殊迭代器reverse不同。此处将会更改容器的位置的值,而下文不更改。

比较两个容器

nvec1>=nvec2

从头开始,比较第一个不同的数。先根据第一个不同的数的大小而定。其次,若完全相同,则两容器相等。若相同但nvec1短,则nvec1更小。

容器的迭代器

迭代器以及特殊迭代器的图示:Nlink.picture

迭代器TODO

可用auto定义,也可用形式vector<int>::iterator定义。

变种:

定义语句:vector<int>::iterator iter=nvec.begin();

更改此项可以更改迭代器指代的项,也可以输出指代的项的值:*iter。而对于iter的更改,为迭代器指代的哪一项。

iter->

特殊迭代器

对于正方向的查找,迭代器形式为vector<int>::iterator

获取第0位的迭代器:nvec.begin();

获取最后一位后的一位的迭代器:nvec.end();,普遍用于下文章节 #相关函数 中,表示函数内没有位置符合要求,如章节中章节 #查找元素的位置

对于反方向的查找,迭代器形式为vector<int>::reverse_iterator

类比正方向的查找:nvec.rbegin();

类比正方向的查找:nvec.rend();

在使用auto定义迭代器时,加上c(如cbegin),可以定义迭代器为常量,即vector<int>::const_iterator

相关函数

排序

bool sortRule(int & a, int & b){
    return a>b;    //降序
}

sort(begin(nvec), end(nvec), sortRule);    //sortRule可省略,默认升序

查找元素的位置

vector<int>::iterator iter=find(nvec.begin(), nvec.end(), 3);
if(iter != nvec.end()){
	int dis = distance(nvec.begin(), iter);
	cout << dis;
}

去除重复的元素

sort(nvec.begin(), nvec.end());
vector<int>::iterator iter = unique(nvec.begin(), nvec.end());
if (iter != nvec.end()) {
	nvec.erase(iter, nvec.end());
}

求两个容器的交集或并集

//j存放交集,b存放并集
sort(nvec1.begin(),nvec1.end());
sort(nvec2.begin(),nvec2.end());
set_intersection(nvec1.begin(),nvec1.end(),nvec2.begin(),nvec2.end(),inserter(j,j.begin()));
set_union(nvec1.begin(),nvec1.end(),nvec2.begin(),nvec2.end(),inserter(b,b.begin()));

参考和推荐

笔记 - vector常用语法汇总 - 《算法竞赛入门经典(第2版)》尾页空白页
// 来源于图书馆,含33条常用的语法,已大部分涵盖在本页中

纸质书 - 《算法竞赛入门经典(第2版)》 - P109 ~ P113
// 小部分实用语法及算法,和实际运用样例

纸质书 - 《C++ Primer 中文版(第5版)》 - P86 ~ P101
// 权威和规范的语法及解释,和最清楚的迭代器的介绍

网页 - Microsoft Learn - vector 类
// 最全的语法及示例,较权威和清晰

网页 - CSDN - C++ 容器类 vector
// 较多相关算法,和小部分常用语法

基本语法

容器的赋值与取用

容器的迭代器

相关函数