C++——vector

 


 
 

  
vector的结构
vector 包含在头文件< vector >中:

#include <vector>

在此头文件内,类型 vector 是一个定义于 namespace std 内的 template:

namespace std {
	template <typename T, 
				typename Allocator = allocator<T> > 
	class vector;
}

Vector 的元素可以是任意类型 T。可有可无的第二个 template 参数用来定义内存模型。默认的内存模型是 C++ 标准库提供的 allocator。
  模板类 vector 类似于 string 类,也是一种动态数组。可以在运行阶段设置 vector 对象的长度,可在末尾附加新数据,还可以在中间插入新数据。基本上,它是使用 new 创建动态数组的替代品。
 
 

 
 

 
 

vector 构造

操作描述
vector< Elem > cDefault 构造函数,产生一个空 vector,没有任何元素
vector< Elem > c(c2)Copy 构造函数,建立 c2 的同型 vector 并成为 c2 的一份铂贝(所有元素都被复制)
vector< Elem > c = c2Copy 构造函数,建立一个新的 vector 作为 c2 的拷贝(每个元素都被复制)
vector< Elem > c = rvMove 构造函数,建立一个新的 vector,取 rvalue rv 的内容(始自C++11
vector< Elem > c(n)利用元素的 default 构造函数生成一个大小为 n 的 vector
vector< Elem > c(n, elem)建立一个大小为 n 的 vector,每个元素值都是 elem
vector< Elem > c(beg, end)建立一个 vector,以区间 [beg, end) 作为元素初值
vector< Elem > c(initlist)建立一个 vector,以初值列 initlist 的元素为初值(始自C++11
vector< Elem > c = initlist建立一个 vector,以初值列 initlist 的元素为初值(始自C++11
c.~vector()销毁所有元素,释放内存
#include <iostream>
#include <vector>
using namespace std;

int main(){
	vector<int> c;//创建一个空vector 
	
	vector<int> c1(20);//创建一个大小为20的vector 
	
	vector<int> c2(20, 1);//创建一个大小为20,每个元素值都是1的vector 
	
	int n = 10;
	vector<int> c3(n);//创建一个大小为n的vector 
	
	int a[5] = {1, 2, 3, 4, 5};
	vector<int> c4(a, a + 5);//复制[a, a + 5)之间的元素到vector 
	
	vector<int> c5{1, 2, 3, 4, 5};
	vector<int> c6 = {1, 2, 3, 4, 5};
	
	vector< vector<int> > c7(8, vector<int> (12, 0));//二维数组 
	return 0;
}

 
 

 
 

 
 

vector 非更易型操作

操作描述
c.empty()返回是否容器为空(相当于 size() == 0 但也许较快)
c.size()返回目前的元素个数
c.max_size()返回元素个数之最大可能量
c.capacity()返回 “不进行空间重新分配” 条件下的元素最大容纳量
c.reserve(num)如果容量不足,扩大之
c.shrink_to_fit()要求降低容量,以符合元素个数(始自C++11
c1 == c2返回 c1 是否等于 c2(对每个元素调用==)
c1 != c2返回 c1 是否不等于 c2(相当于!(c1==c2))
c1 < c2返回 c1 是否小于 c2
c1 > c2返回 c1 是否大于 c2(相当于 c2 < c1)
c1 <= c2返回 c1 是否小于等于 c2(相当于 !(c2<c1))
c1 >= c2返回 c1 是否大于等于 c2(相当于 !(c1<c2))
#include <iostream>
#include <vector>
using namespace std;

int main(){
	int a[7] = {1, 2, 3, 4, 5, 6, 7};
	vector<int> c(a, a + 5);//复制[a, a + 5)之间的元素到vector 
	vector<int> c1(20);
	c1[0] = 1;
	vector<int> c2(a, a + 5);
	vector<int> c3(a + 1, a + 6);
	
	printf("c--vector是否为空:%d\n", c.empty()); 
	printf("c--vector目前元素个数:%d\n", c.size());
	printf("c1--vector目前元素个数:%d\n", c1.size());
	printf("c--vector元素个数之最大可能量:%lld\n", c.max_size());
	printf("c--vector不重新分配空间元素最大容纳量:%d\n", c.capacity());
	c1.reserve(30);
	printf("c1--vector不重新分配空间元素最大容纳量:%d 0号位上的元素:%d\n\n", c1.capacity(), c1[0]);
	printf("c2 == c:%s\n", c2 == c ? "true" : "false");
	printf("c3 != c:%s\n", c3 != c ? "true" : "false");
	printf("c3 <  c:%s\n", c3 <  c ? "true" : "false");
	printf("c3 >  c:%s\n", c3 >  c ? "true" : "false");
	printf("c3 <= c:%s\n", c3 <= c ? "true" : "false");
	printf("c3 >= c:%s\n", c3 >= c ? "true" : "false");
	return 0;
}

运行结果
 
 

 
 

 
 

vector 赋值

操作描述
c = c2将 c2 的全部元素赋值给 c
c = rv将 rvalue rv 的所有元素以 move assign 方式给予 c(始自C++11
c = initlist将初值列 initlist 的所有元素赋值给 c(始自C++11
c.assign(n, elem)复制 n 个 elem,赋值给 c
c.assign(beg, end)将区间 [beg, end) 内的元素赋值给 c
c.assign(initlist)将初值列 initlist 的所有元素赋值给 c
c1.swap(c2)置换 c1 和 c2 的数据
swap(c1, c2)置换 c1 和 c2 的数据
#include <iostream>
#include <vector>
using namespace std;

int main(){
	int a[7] = {1, 2, 3, 4, 5, 6, 7};
	vector<int> c(a, a + 5);//复制[a, a + 5)之间的元素到vector 
	vector<int> c1(5);
	vector<int> c2(5);
	vector<int> c3(5);
	
	c1 = c;
	printf("c1赋值c中所有元素:");
	for(int i = 0; i < c1.size(); i ++)
		printf("%d ", c1[i]);
	printf("\n");
	
	c2.assign(5, 2);
	printf("c2元素赋值为2:");
	for(int i = 0; i < c2.size(); i ++)
		printf("%d ", c2[i]);
	printf("\n");
	
	c3.assign(a+1, a+6);
	printf("c3赋值[a+1, a+6)的元素:");
	for(int i = 0; i < c3.size(); i ++)
		printf("%d ", c3[i]);
	printf("\n");
	
	c1.swap(c2);
	printf("c1与c2交换元素--c1:");
	for(int i = 0; i < c1.size(); i ++)
		printf("%d ", c1[i]);
	printf("\n");
	
	swap(c1, c2);
	printf("c1与c2交换元素--c1:");
	for(int i = 0; i < c1.size(); i ++)
		printf("%d ", c1[i]);
	printf("\n");
	return 0;
}

运行截图
 
 

 
 

 
 

vector 元素访问

操作描述
c[idx]返回索引 idx 所指的元素(不检查范围)
c.at(idx)返回索引 idx 所指的元素(如果 idx 超出范围就抛出 range-error 异常)
c.front()返回第一元素(不检查是否存在第一元素)
c.back()返回最末元素(不检查是否存在最末元素)

 
 

 
 

 
 

vector 安插和移除元素

操作描述
c.push_back(elem)附加一个 elem 的拷贝于末尾
c.pop_back()移除最后一个元素,但是不返回它
c.insert(pos, elem)在 iterator 位置 pos 之前方插入一个 elem 拷贝,并返回新元素的位置
c.insert(pos, n, elem)在 iterator 位置 pos 之前方插入 n 个 elem 拷贝,并返回第一个新元素的位置(或返回 pos———如果没有新元素的话)
c.insert(pos, beg, end)在 iterator 位置 pos 之前方插入区间 [beg, end) 内所有元素的一份铂贝,并返回第一个新元素的位置(或返回pos——如果没有新元素的话)
c.insert(pos, initlist)在 iterator 位置 pos 之前方插入初值列 initlist 内所有元素的一份拷贝,并返回第一个新元素的位置(或返回 pos——如果没有新元素的话;始自C++11
c,emplace(pos, args…)在 iterator 位置 pos 之前方插入一个以 args 为初值的元素,并返回新元素的位置(始自C++11
c.emplace_back(args…)附加一个以 args 为初值的元素于末尾,不返回任何东西(始自C++11
c.erase(pos)移除 iterator 位置 pos 上的元素,返回下一元素的位置
c.erase(beg, end)移除 [beg, end) 区间内的所有元素,返回下一元素的位置
c.resize(num)将元素数量改为 num(如果 size() 变大,多出来的新元素都需以 default 构造函数完成初始化)
c.resize(num, elem)将元素数量改为 num(如果 size() 变大,多出来的新元素都是 elem 的拷贝)
c.clear()移除所有元素,将容器清空
c.begin()返回一个 random-access iterator 指向第一元素
c.end()返回一个 random-access iterator 指向最末元素的下一位置
c.cbegin()返回一个 const random-access iterator 指向第一元素(始自C++11
c.cend()返回一个 const random-access iterator 指向最末元素的下一位置(始自C++11
c.rbegin()返回一个反向的 (reverse)iterator 指向反向迭代的第一元素
c.rend()返回一个反向的 (reverse) iterator 指向反向迭代的最末元素的下一位置
c.crbegin()返回一个 const reverse iterator 指向反向迭代的第一元素(始自C++11
c.crend()返回一个 const reverse iterator 指向反向迭代的最末元素的下一位置(始自C++11
#include <iostream>
#include <vector>
using namespace std;

int main(){
	int a[8] = {1, 2, 3, 4, 5, 6, 7, 8};
	vector<int> c(a, a + 5);//复制[a, a + 5)之间的元素到vector 
	vector<int> c1(5);
	vector<int> c2(5);
	vector<int> c3(5);
	
	c.push_back(6);
	printf("向c末尾加一个6:");
	for(int i = 0; i < c.size(); i ++)
		printf("%d ", c[i]);
	printf("\n");
	
	c.pop_back();
	printf("移除c末尾的6:");
	for(int i = 0; i < c.size(); i ++)
		printf("%d ", c[i]);
	printf("\n");
	
	c.insert(c.end(), 6);
	printf("c末尾插入6:");
	for(int i = 0; i < c.size(); i ++)
		printf("%d ", c[i]);
	printf("\n");
	
	c.insert(c.end(), 2, 7);
	printf("c末尾插入两个7:");
	for(int i = 0; i < c.size(); i ++)
		printf("%d ", c[i]);
	printf("\n");
	
	c.insert(c.end(), a + 7, a + 8);
	printf("c末尾插入一个8:");
	for(int i = 0; i < c.size(); i ++)
		printf("%d ", c[i]);
	printf("\n");
	
	c.erase(c.begin());
	printf("c删除第一个元素:");
	for(int i = 0; i < c.size(); i ++)
		printf("%d ", c[i]);
	printf("\n");
	
	c.erase(c.begin(), c.end());
	printf("c删除所有元素:");
	for(int i = 0; i < c.size(); i ++)
		printf("%d ", c[i]);
	printf("\n"); 
	
	c.resize(10);
	printf("将c的大小改为10:%d\n", c.size());
	
	c.resize(20, 10);
	printf("c大小改为20,增加的赋值为20:");
	for(int i = 0; i < c.size(); i ++)
		printf("%d ", c[i]);
	printf("\n"); 
	
	c.clear();
	printf("移除所有元素,容器清空:%d\n", c.size());
	
	for(int i = 0; i < 5; i ++)
		c.push_back(i + 1); 
	printf("\n\nbegin():%d\n", *c.begin());
	printf("end():%d\n", *c.end());
	printf("rbegin():%d\n", *c.rbegin());
	printf("rend():%d\n", *c.rend());
	return 0;
}

运行截图

 
 

 
 

 
 
参考书籍 :C++标准库(第二版)——侯捷译

C++中,vector是一种动态数组,它可以根据需要自动调整大小。引用\[1\]和引用\[2\]展示了两种不同的初始化vector的方法。你可以使用下标运算符\[\]来像数组一样访问vector的元素,并且可以进行读写操作。引用\[3\]中的代码展示了如何使用下标运算符来遍历vector并对元素进行操作。另外,你也可以使用迭代器来遍历vector,迭代器类似于指针,可以指向vector中的元素,并且支持自增操作。引用\[3\]中的代码展示了如何使用迭代器来遍历vector并对元素进行操作。此外,C++11引入了范围for循环,可以更方便地遍历vector中的元素。通过范围for循环,你可以直接遍历vector中的每个元素,而不需要使用迭代器或下标运算符。 #### 引用[.reference_title] - *1* *2* [C++vector介绍](https://blog.youkuaiyun.com/m0_55004108/article/details/122519485)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v4^insert_chatgpt"}} ] [.reference_item] - *3* [C++——vector](https://blog.youkuaiyun.com/Ll_R_lL/article/details/127113038)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值