文章目录
C++ Vector知识点
vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
vector是STL的动态数组,在运行时能根据情况需要改变数组的大小。由于它是以数组形式存储,也就是说它的内存空间是连续的,所以索引可以在常数时间内完成,但是在中间进行插入和删除会造成内存块的复制。另外,如果数组后面的内存空间不够,需要申请一块足够大的内存,会影响vector的效率,同时使迭代器失效。
先看下下列函数基本功能,然后在目录查找,定位到相应函数,有相应的代码片段和解释
头文件
#include<iostream>
#include<vector>
using namespace std;
定义
- 定义int型
- 定义string型
- 定义结构型数组
- 还可以定义多维数组,例如定义一个二维数组:
vector <int> a[MAXN];
其第一维大小是固定的MAXN,第二维是动态的。
vector<int> vec; //定义int型数组
vector<string> vec1;//定义string型数组
struct STU{
int age;
};
vector<STU> vec2; //定义结构型数组
构造函数
语法:
vector();
vector( size_type num, const TYPE &val );
vector( const vector &from );
vector( input_iterator start, input_iterator end );
C++ Vectors可以使用以下任意一种参数方式构造:
- 无参数 - 构造一个空的vector,
- 数量(num)和值(val) - 构造一个初始放入num个 值为val的元素的Vector
- vector(from) - 构造一个与vector from 相同的vector
- 迭代器(start)和迭代器(end) - 构造一个初始值为[start,end)区间元素的Vector(注:半开区间).
vector<int> vec; // 空的vector 不能输出
vector<int> vec1(3);//三个元素均为 0
vector<int> vec2(3,12);//三个元素均为1
vector<int> vec3(vec2);//将vec2的元素初始化给vec3
//参数类型要相同
//用迭代器初始化
vector<int>::iterator ite = vec2.begin();//指向vec的头
vector<int>::iterator ite1 = vec2.end(); //指向vec的尾
vector<int> vec4(ite, ite1);
输出结果:
属性
1.容量(重新分配,则迭代器失效)
语法:
size_type capacity();
- 返回vector所能容纳的元素数量(在不重新分配内存的情况下)
- capacity() 函数 返回当前vector在重新进行内存分配以前所能容纳的元素数量.
vector<int> vec;
cout << vec.capacity() << endl;
vector<int> vec1(3);
cout << vec1.capacity() << endl;
vec1.push_back(1); //在vector尾部加一个元素
cout << vec1.capacity() << endl;
输出结果:
语法:
void reserve( size_type size );
- 设置Vector最小的元素容纳数量(只能变大,不能变小)(设置多大就是多大)(重新分配后,迭代器失效)
- reserve()函数为当前vector预留至少共容纳size个元素的空间.(译注:实际空间可能大于size)
vector<int> vec2(3);//三个元素均为零
cout << vec2.capacity() << endl;
vec2.reserve(10);
cout << vec2.capacity() << endl;
输出结果:
语法:
size_type size();
- 返回Vector元素数量的大小
- size() 函数返回当前vector所容纳元素的数目
vector<int> vec3(3,12);
vec3.reserve(5);//当前vec3容器为5,元素为3
cout << vec3.size() << endl;
输出结果:
2.大小
语法:
void resize( size_type size, TYPE val );
- 改变Vector元素数量的大小
- resize() 函数改变当前vector的大小为size,且对新创建的元素赋值val
vector<int> vec3(3,12);
vec3.reserve(5);//当前vec3容器为5,元素为3
cout << vec3.size() << endl;
vec3.resize(4); //只改变容器元素的数量,不改变容器空间大小
cout << vec3.size() << endl;
cout << vec3.capacity() << endl;
输出结果:
语法:
bool empty();
- 判断Vector是否为空(返回true时为空)
- 如果当前vector没有容纳任何元素,则empty()函数返回true,否则返回false.例如,以下代码清空一个vector,并按照逆序显示所有的元素:
vector<int> vec;
vector<int> vec1(3);
cout << vec.empty() << endl;
cout << vec1.empty() << endl;
输出结果:
语法:
void clear();
- 清空所有元素
- clear()函数删除当前vector中的所有元素.
vector<int> vec(3,2);
cout << vec.capacity() << endl;
cout << vec.size() << endl;
vec.clear();
cout << vec.capacity() << endl;
cout << vec.size() << endl;
输出结果:
操作
1.增
语法:
void push_back( const TYPE &val );
- 在Vector最后添加一个元素
- push_back()添加值为val的元素到当前vector末尾
vector<int> vec;
for(int i=10;i<20;i++){
vec.push_back(i); //在vec尾部依次加 i的
}
for(int i=0;i<10;i++){
cout << vec[i] << " ";
}
输出结果:
语法:
iterator insert( iterator loc, const TYPE &val );
void insert( iterator loc, size_type num, const TYPE &val );
void insert( iterator loc, input_iterator start, input_iterator end );
-
插入元素到Vector中
-
insert() 函数有以下三种用法:
- 在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器,
- 在指定位置loc前插入num个值为val的元素
- 在指定位置loc前插入区间[start, end)的所有元素 .
vector<int> vec1(3,1);
vector<int> vec2(5,2);
for ( int i=0;i<vec1.size();i++){
cout << vec1[i] << " ";
}
cout << endl;
vec1.insert(vec1.begin(),7);//将vec1的第一个改为7
for ( int i=0;i<vec1.size();i++){
cout << vec1[i] << " ";
}
cout << endl;
vec1.insert(vec1.begin()+1,3,6);//在第二个位置加入3个6
for ( int i=0;i<vec1.size();i++){
cout << vec1[i] << " ";
}
cout<< endl;
vec1.insert(vec1.begin()+2,vec2.begin(),vec2.begin()+2);
//在vec1的第三个位置加入vec2的第1到第2个
for(int i=0;i< vec1.size();i++){
cout << vec1[i] << " ";
}
cout<< endl;
输出结果为:
2.删
语法:
void pop_back();
- 移除最后一个元素
- pop_back()函数删除当前vector最末的一个元素
vector<char> vec;
for(int i=0;i<10;i++){
vec.push_back( i + 65);
}
for(int i=0;i<10;i++){
vec.pop_back();//删除vec尾部最后一个元素
for(int i=0;i<vec.size();i++)
cout << vec[i];
cout << endl;
}
//或者用迭代器
// int size = vec.size();
// vector<char>::iterator theIterator;
// for( int i=0; i < vec.size(); i++ ) {
// vec.pop_back();
// for( theIterator = vec.begin(); theIterator != vec.end(); theIterator++ )
// cout << *theIterator;
// cout << endl;
// }
输出结果:
语法:
iterator erase( iterator loc );
iterator erase( iterator start, iterator end );
- 删除指定元素
- erase函数要么删作指定位置loc的元素,要么删除区间[start, end)的所有元素. 返回值是指向删除的最后一个元素的下一位置的迭代器
vector<char> vec1;
for(int i=0;i<10;i++){
vec1.push_back(i+65);
}
int size1=vec1.size();
for(int i=0;i<size1;i++){
vec1.erase(vec1.begin()); //删除vec1的首个元素
for(int i=0;i<vec1.size();i++)
cout << vec1[i];
cout << endl;
}
// 或者用迭代器
// vector<char>::iterator startIterator;
// vector<char>::iterator tempIterator;
// for( int i=0; i < size1; i++ ){
// startIterator = vec1.begin();
// vec1.erase(startIterator);
// for( tempIterator = vec1.begin(); tempIterator != vec1.end(); tempIterator++ )
// cout << *tempIterator;
// cout << endl;
//
// }
输出结构:
3.改
修改元素,可以用insert()函数,在前面有提到
语法:
void assign( input_iterator start, input_iterator end );
void assign( size_type num, const TYPE &val );
- 对Vector中的元素赋值
- assign() 函数要么将区间[start, end)的元素赋到当前vector,或者赋num个值为val的元素到vector中.这个函数将会清除掉为vector赋值以前的内容.
vector<int> vec;
vector<int> vec1(5,1);
vec.assign(vec1.begin(),vec1.begin()+3);
//将vec1的第一个到第三个赋值给vec
for( int i=0;i<vec.size();i++){
cout << vec[i] << " ";
}
cout << endl;
vec1.assign(3,6);
//将三个6赋值给vec1,并将之前vec1的内容清除
for( int i=0;i<vec1.size();i++){
cout << vec1[i] << " ";
}
cout << endl;
输出结果:
4.查
1.返回Vector首个元素
语法:
iterator begin();
语法:
TYPE front();
- front()函数返回当前vector起始元素的引用
2.返回Vector最后一个元素
语法:
iterator end();
语法:
TYPE back();
- back() 函数返回当前vector最末一个元素的引用
3.返回指定位置
语法:
TYPE at( size_type loc );
- at() 函数 返回当前Vector指定位置loc的元素的引用. at() 函数 比 [] 运算符更加安全, 因为它不会让你去访问到Vector内越界的元素.
vector<int> v( 5, 1 );
for( int i = 0; i < 10; i++ ) {
cout << "Element " << i << " is " << v[i] << endl;
}
因为v中只有五个元素均为1,而循环中到10,显然越界,会造成不可预知的事情发生,
如图:
若用at(),代码将更加安全:
vector<int> v( 5, 1 );
for( int i = 0; i < 10; i++ ) {
cout << "Element " << i << " is " << v.at(i) << endl;
}
取代试图访问内存里非法值的作法,at() 函数能够辨别出访问是否越界并在越界的时候抛出一个异常.
4.返回全部内容
void fun(int i)
{
cout << i << endl;
}
void VecChange()
{
vector<int> vec;
for(int i=0 ;i<10 ;i++)
{
vec.push_back(i);
}
for_each(vec.begin(), vec.end(), fun);
//for_each()使用需加#include<algorithm>头文件
}
输出结果:
其他函数和运算符重载
Operators
语法:
v1 == v2
v1 != v2
v1 <= v2
v1 >= v2
v1 < v2
v1 > v2
v[]
两个vectors被认为是相等的,如果:
1.它们具有相同的容量
2.所有相同位置的元素相等.
vectors之间大小的比较是按照词典规则.
语法:
void swap( vector &from );
- 交换两个Vector
- swap()函数交换当前vector与vector from的元素
vector<int> vec(3,1);
vector<int> vec1(3,6);
vec.swap(vec1); //将vec与vec1内容交换
扩展算法
需要的头文件:#include < algorithm>
遍历:for_each
void STLSuan( )
{
vecor<int> vec;
vec.push_back(2);
vec.push_back(1);
vec.push_back(4);
vec.push_back(3);
sort(vec.begin()+1 , vec.end()); //第二个到最后一个进行从小到大排序
sort( vec.begin()+1 , vec.end() , greate<int>() );
//从大到小排序,用greater需要加头文件#include<functional>
}
以上所用到的代码整体如下:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void VecDefine()
{
vector<int> vec; //定义int型数组
vector<string> vec1;//定义string型数组
// struct STU{
// int age;
// int y;
// };
// vector<struct STU> vec2; //定义结构型数组
}
//构造函数
void VecConstructor()
{
vector<int> vec; // 空的vector 不能输出
vector<int> vec1(3);//三个元素均为 0
vector<int> vec2(3,12);//三个元素均为12
vector<int> vec3(vec2);//将vec2的元素初始化给vec3
//参数类型要相同
for(int i=0;i<3;i++){
cout << vec1[i] << " ";
}
cout << endl;
for(int i=0;i<3;i++){
cout << vec2[i] << " ";
}
cout << endl;
for(int i=0;i<3;i++){
cout << vec3[i] << " ";
}
cout << endl;
//用迭代器初始化
vector<int>::iterator ite = vec2.begin();//指向vec的头
vector<int>::iterator ite1 = vec2.end(); //指向vec的尾
vector<int> vec4(ite, ite1);
for(int i=0;i<3;i++){
cout << vec4[i] << " ";
}
cout << endl;
}
//属性
void VecCapacity()
{
vector<int> vec;
cout << vec.capacity() << endl;
vector<int> vec1(3);
cout << vec1.capacity() << endl;
vec1.push_back(1); //在vector尾部加一个元素
cout << vec1.capacity() << endl;
vector<int> vec2(3);
cout << vec2.capacity() << endl;
vec2.reserve(10);
cout << vec2.capacity() << endl;
vector<int> vec3(3,12);
vec3.reserve(5);//当前vec3容器为5,元素为3
cout << vec3.size() << endl;
vec3.resize(4);
cout << vec3.size() << endl;
cout << vec3.capacity() << endl;
cout << vec.empty() << endl;
cout << vec1.empty() << endl;
vector<int> vec4(3,2);
cout << vec4.capacity() << endl;
cout << vec4.size() << endl;
vec4.clear();
cout << vec4.capacity() << endl;
cout << vec4.size() << endl;
}
//操作
void VecDo()
{
vector<int> vec;
for(int i=10;i<20;i++){
vec.push_back(i); //在vec尾部依次加 i的
}
for(int i=0;i<10;i++){
cout << vec[i] << " ";
}
vector<int>::iterator ite = vec.begin();
for(ite; ite != vec.end(); ite++){
cout << *ite << endl;
} //用迭代器输出
}
//增
void VecAdd()
{
vector<int> vec;
for(int i=10;i<20;i++){
vec.push_back(i); //在vec尾部依次加 i的
}
for(int i=0;i<10;i++){
cout << vec[i] << " ";
}
cout << endl;
vector<int> vec1(3,1);
vector<int> vec2(5,2);
for ( int i=0;i<vec1.size();i++){
cout << vec1[i] << " ";
}
cout << endl;
vec1.insert(vec1.begin(),7);//将vec1的第一个改为7
for ( int i=0;i<vec1.size();i++){
cout << vec1[i] << " ";
}
cout << endl;
vec1.insert(vec1.begin()+1,3,6);//在第二个位置加入3个6
for ( int i=0;i<vec1.size();i++){
cout << vec1[i] << " ";
}
cout<< endl;
vec1.insert(vec1.begin()+2,vec2.begin(),vec2.begin()+2);
//在vec1的第三个位置加入vec2的第1到第2个
for(int i=0;i< vec1.size();i++){
cout << vec1[i] << " ";
}
cout<< endl;
}
//删
void VecDel()
{
vector<char> vec;
for(int i=0;i<10;i++){
vec.push_back( i + 65);
}
for(int i=0;i<10;i++){
vec.pop_back(); //删除vec尾部最后一个元素
for(int i=0;i<vec.size();i++)
cout << vec[i];
cout << endl;
}
//或者用迭代器
// int size = vec.size();
// vector<char>::iterator theIterator;
// for( int i=0; i < vec.size(); i++ ) {
// vec.pop_back();
// for( theIterator = vec.begin(); theIterator != vec.end(); theIterator++ )
// cout << *theIterator;
// cout << endl;
// }
///----------------------------------
vector<char> vec1;
for(int i=0;i<10;i++){
vec1.push_back(i+65);
}
int size1=vec1.size();
for(int i=0;i<size1;i++){
vec1.erase(vec1.begin());
for(int i=0;i<vec1.size();i++)
cout << vec1[i];
cout << endl;
}
// 或者用迭代器
// vector<char>::iterator startIterator;
// vector<char>::iterator tempIterator;
// for( int i=0; i < size1; i++ ){
// startIterator = vec1.begin();
// vec1.erase(startIterator);
// for( tempIterator = vec1.begin(); tempIterator != vec1.end(); tempIterator++ )
// cout << *tempIterator;
// cout << endl;
//
// }
}
//改
void VecChange()
{
vector<int> vec;
vector<int> vec1(5,1);
vec.assign(vec1.begin(),vec1.begin()+3);
//将vec1的第一个到第三个赋值给vec
for( int i=0;i<vec.size();i++){
cout << vec[i] << " ";
}
cout << endl;
vec1.assign(3,6);
//将三个6赋值给vec1,并将之前vec1的内容清除
for( int i=0;i<vec1.size();i++){
cout << vec1[i] << " ";
}
cout << endl;
vec.swap(vec1);
}
//查
void fun(int i)
{
cout << i << endl;
}
void VecFind()
{
// vector<int> v( 5, 1 );
// for( int i = 0; i < 10; i++ ) {
// cout << "Element " << i << " is " << v[i] << endl;
// }
// vector<int> v( 5, 1 );
// for( int i = 0; i < 10; i++ ) {
// cout << "Element " << i << " is " << v.at(i) << endl;
// }
vector<int> vec;
for(int i=0 ;i<10 ;i++)
{
vec.push_back(i);
}
for_each(vec.begin(), vec.end(), fun);
//for_each()使用需加#include<algorithm>头文件
}
int main()
{
//VecDefine();
//VecConstructor();
//VecCapacity();
//VecDo();
//VecAdd();
//VecDel();
//VecChange();
//VecFind();
system("pause");
return 0;
}