定义: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
可用auto
定义,也可用形式vector<int>::iterator
定义。
变种:
vector<int>::reverse_iterator
。其中reverse_iterator
在下文章节 #特殊迭代器 中使用。
vector<int>::const_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
// 较多相关算法,和小部分常用语法