C++ 《STL 之 vector 学习笔记》

目录

简介:

声明:

迭代器:

用法:

遍历vector

插入元素

排序

查找元素

二维数组:

定义

插入操作


简介:

vector类称作向量类,它实现了动态的数组,用于元素数量变化的对象数组。

顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。

扩大新元素时,如果超过当前的容量,则容量会自动扩充2倍,如果2倍容量仍不足,则继续扩大2倍。

声明:

vector<object_type> v1;       

构造函数:
vector():创建一个空的vector。
vector(itn nSize):创建一个vector,元素个数为nSize。
vector(int nSize, const T& t):创建一个vector,元素个数为nSize,且值均为t。
vector(const vector&):拷贝构造函数。

vector<int> vec;		//声明一个int型向量

vector<int> vec(5);		//声明一个初始大小为5的int向量

vector<int> vec(10, 1);	//声明一个初始大小为10且值都是1的向量

vector<int> vec(tmp);	//声明并用tmp向量初始化vec向量

vector<int> tmp(vec.begin(), vec.begin() + 3);	//用向量vec的第0个到第2个值初始化tmp

int arr[5] = {1, 2, 3, 4, 5};	
vector<int> vec(arr, arr + 5);		//将arr数组的元素用于初始化vec向量
//和vec.end()指针统一。
vector<int> vec(&arr[1], &arr[4]); //将arr[1]~arr[4]范围内的元素作为vec的初始值

vector<int> v4{10, 1};  // v4有2个元素,值分别是10和1

vector<string> v5{"hi"}; // 列表初始化:v5有一个元素

迭代器:

vector<object_type>::iterator it;         正常迭代器

  • 开始指针:vec.begin();
  • 末尾指针:vec.end();    //指向最后一个元素的下一个位置
  • 指向常量的开始指针: vec.cbegin(); //意思就是不能通过这个指针来修改所指的内容,但还是可以通过其他方式修改的,而且指针也是可以移动的。
  • 指向常量的末尾指针: vec.cend()

vector::reverse_iterator ritr;             反向迭代器

  • vec.rbegin();    指向vector的最后一个元素
  • vec.rend();       指向vector的第一个元素的前一个位置

vector<char>::const_iterator citr;        常量迭代器

  • vec.cbegin();                        
  • vec.cend();                            

   cbegin()/cend()决定了返回的迭代器类型为const。这时即使vector的类型不是const,也可以防止对该数据的误操作。

用法:

at(idx)传回索引idx所指的数据,如果idx越界,抛出out_of_range。
back()返回最后一个元素,不检查这个数据是否存在。
front()返回第一个元素。
swap()交换两个Vector。  v1.swap(v2) ;  交换v1,v2
push_back(value)在Vector最后添加一个元素。
pop_back()它从向量中删除最后一个元素。
empty()判断Vector是否为空(返回true时为空)
insert(iter,val)它将在指定位置插入新元素。
erase(iterator)删除指定或指定范围的元素。
resize(nsize)它修改向量的大小。
clear()它从向量中删除所有元素。
size()返回Vector元素数量的大小。
capacity()返回vector所能容纳的元素数量(在不重新分配内存的情况下)
assign()它将新值分配给向量。
operator=(vector)它将新值分配给向量容器。
operator[](pos)它访问指定的元素。
end()返回最末元素的迭代器(实指向最末元素的下一个位置)
emplace(pos,args)它将在位置pos之前插入一个新元素。
emplace_back(val)它在末尾插入一个新元素。
rend()它指向向量的第一个元素之前的元素。
rbegin()它指向向量的最后一个元素。
begin()返回第一个元素的迭代器。
max_size()返回Vector所能容纳元素的最大数量(上限)。
cend()它指向量中的last-last-element。
cbegin()它指向量的第一个元素。
crbegin()它指的是向量的最后一个字符。
crend()它指的是向量的第一个元素之前的元素。
data()它将向量的数据写入数组。
sort()排序 
reverse()元素翻转
find ()查找元素,返回地址

遍历vector

vector<int> vec;

//迭代器遍历
vector<int>::iterator it;
for (it = vec.begin(); it != vec.end(); it++)
    cout << *it << endl;

//C++11
for(auto i:vec)
{
    cout<<i<<endl;
}



//at()函数
int count=vec.size();
for(int i=0;i<count;i++)
{
    cout<<vec.at(i)<<endl;
}
//或者
    cout<<vec[i]<<endl;


int* p = vec.data();
//vector在内存中就是一个连续存储的数组,所以可以返回一个指针指向这个数组。这是C++11的特性。

插入元素

//push_back()插入
for (int i = 0; i != 100; i++) {
    vec.push_back(i);
}  

//错误的赋值
for(int i=0;i<10;++i)         //下标只能用来获取已经存在的元素
{
    vec[i]=i;
}

//insert()插入
vec.insert(vec.begin(),6);   //在下标0元素前插入6
vec.insert(vec.begin()+3,1);  //在下标3元素前插入1
v.insert(v.end(),3,0);     //在尾部插入3个0
vec.insert(vec.begin()+1,a+2,a+6);//在下标1元素前插入a的第三个元素到第五个元素(不包括a+6)

排序

//从小到大排序
sort(vec.begin(), vec.end());

//从大到小排序
//1.reverse函数
reverse(vec.begin(),vec.end());
//2.重写cmp
bool cmp(const int& a,const int& b)
{
    return a>b;
}
sort(vec.begin(),vec.end(),cmp);

查找元素

vector<int>::iterator it; 
it=find(vec.begin(), vec.end(), 6);
if(it!=vec.end())
    cout<<*it<<endl;
else
    cout<<"can not find"<<endl;


//vector本身是没有find这一方法,其find是依靠algorithm来实现的。

二维数组:

定义

vector<vector<int> > A;	//正确的定义方式,后面的尖括号前要加上空格
vector<vector<int>> A;	//c++11之前这样定义是错误的,c++11之后支持这种定义方式

vector<vector<int> >A(3);    //定义二维动态数组大小3行

vec.size();     //二维数组的行数
vec[0].size();  //二维数组的列数

插入操作

//A=[[0,1,2],[3,4,5]]
vector<vector<int> > A;  // 大容器
//A.push_back里必须是vector
vector<int> B;  // 小容器
B.push_back(0);
B.push_back(1);
B.push_back(2);
A.push_back(B); // 小容器放入大容器
B.clear();   // 小容器元素清空
B.push_back(3);
B.push_back(4);
B.push_back(5);
A.push_back(B);

//或者
vector<vector<int> > v;
vector<int> temp;
// 输入元素  
	for(i=0; i<n; i++) {
		temp.clear(); // 清空temp内元素; 
		for(j=0; j<n; j++) {
			cin >>  num;
			temp.push_back(num);
		}
		v.push_back(temp);
	}

//遍历输出所有元素
	for(i=0; i<n; i++) {
		for(j=0; j<n; j++) {
			cout<<v[i][j] << "  ";
		}
		cout <<endl;
	}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值