C++ STL vector学习笔记(基本用法总结)

vector学习笔记

这里我也是看了许多讲解vector的博客才来写下我自己的认识,主要是关于简单概念和操作的内容,至于具体的内部实现,此处不涉及。有错误请批评指出,谢谢!

写在前面:

向量(vector 容器类):#include <vector>,vector 是一种动态数组,是基本数组的类模板。其内部定义了很多基本操作。

建立vector容器印象:

动态增长:插入新元素,如果原有的空间不足时,自动重新申请更大的空间(默认两倍),将圆数据拷贝到新空间,再进行添加数据操作

单口容器:在数据中间插入的方法效率低,故使用较少,大多尾插

  • 几种常用的初始化和遍历

/*1-vector*/
#include <iostream>
#include <vector>
#include <iterator>//用到几种迭代器
#include <numeric>
using namespace std;
int main (void){
	vector<int> v;
	for(int i = 0; i < 10; ++i){
		v.push_back(i);
	}
	//下标遍历:
	for(int i = 0; i < v.size(); ++i){
		cout << v[i] << " ";
	} 
	cout << endl;
	//迭代器遍历: 
	for(vector<int>::iterator it = v.begin(); it != v.end(); ++it){
		cout << *it << " ";
	}
	cout << endl;
	//copy()函数遍历: 
	copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	//累加
	int sum = 0;
	sum = accumulate(v.begin(), v.end(), 0);
	cout << sum << endl;
	
	return 0;
} 

这里复制操作还有一个用assign()的,写在后文中了。

  • 关于操作函数

既然这是一个类,那么它就会有 自己的构造函数,上面的初始化和遍历中就用到了一些函数:

v.begin() , v.end() , v.size() , v.push_back()。

合集:

1.push_back()    在数组的最后添加一个数据

2.pop_back()      去掉数组的最后一个数据

3.at()                   得到编号位置的数据

4.begin()             得到数组头的指针

5.end()                得到数组的最后一个单元+1的指针

6.front()               得到数组头的引用

7.back()               得到数组的最后一个单元的引用

8.max_size()       得到vector最大可以是多大

9.capacity()         当前vector分配的大小

10.size()              当前使用数据的大小

11.resize()           改变当前使用数据的大小,如果它比当前使用的大,则填充默认值

12.reserve()        改变当前vecotr所分配空间的大小

13.erase()           删除指针指向的数据项

14.clear()            清空当前的vector

15.rbegin()          将vector反转后的开始指针返回(其实就是原来的end-1)

16.rend()             将vector反转构的结束指针返回(其实就是原来的begin-1)

17.empty()           判断vector是否为空

18.swap()            与另一个vector交换数据

19.assign()          赋值

  • 例程:

其中包含v.begin(), v.end(), v.push_back(), v.size(), v.pop_back(), v.front(), v.back(), v.at(), v.empty(), v.erase(), v.clear(), v.assign(), v.insert()等。。。当然还有很多其他的函数,但我感觉不太常用。

/*vector-2*/
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>//用到几种迭代器
using namespace std;
void print(vector <int> v){
	cout << "大小为: " << v.size() << endl;
	for(int i = 0; i < v.size(); ++i){
		cout << v[i] << ' '; 
	}
	cout << endl << "---------------------" << endl;
}
/*自定义排序 
bool mycmp(const int &a, const int &b){
	return a > b;
}
*/
int main(void){
	vector <int> v1;
	cout << "v1: " << endl;
	print(v1);
	/*
	v1:
	大小为: 0
	---------------------
	*/
	vector <int> v2(5);
	cout << "v2: " << endl;
	print(v2);
	/*
	v2:
	大小为: 5
	0 0 0 0 0
	---------------------
	*/
	vector <int> v3(5, 5);
	cout << "v3: " << endl;
	print(v3);
	/*
	v3:
	大小为: 5
	5 5 5 5 5
	---------------------
	*/
	//使用push_back方法尾部插入元素 
	v1.push_back(1);	//v1尾部插入1 
	cout << "v1: " << endl;
	print(v1);
	v3.push_back(3);	//v3尾部插入3 
	cout << "v3: " << endl;
	print(v3);
	/*
	v1:
	大小为: 1
	1
	---------------------
	v3:
	大小为: 6
	5 5 5 5 5 3
	---------------------
	*/
	//使用pop_back删除尾元素
	v1.pop_back();
	cout << "v1: " << endl;
	print(v1); 
	/*
	v1:
	大小为: 0
	
	---------------------
	*/
	//使用insert方法插入元素
	v2.insert(v2.begin(), 1);		//在v2首部插入1 
	v2.insert(v2.end(), 2);			//在v2尾部插入2 
	v2.insert(v2.begin() + 2, 1);	//在v2第二个元素后插入3
	v2.insert(v2.end() - 2, 2);		//在v2倒数第二个元素前插入2 
	cout << "v2: " << endl;
	print(v2);
	/*
	v2:
	大小为: 9
	1 0 1 0 0 0 2 0 2
	---------------------
	*/ 
	//重新赋值 
	for(int i = 0; i < v3.size(); ++i){
		v3[i] = i;
	} 
	cout << "v3: " << endl;
	print(v3);
	/*
	v3:
	大小为: 6
	0 1 2 3 4 5
	---------------------
	*/
	//使用erase方法删除元素 
	cout << "v3: " << endl;
	v3.erase(v3.begin() + 1);	//删除第一个元素 
	print(v3);
	v3.erase(v3.begin() + 2, v3.begin() + 4);//从第二个元素一直删到第四个元素 
	print(v3);
	/*
	v3:
	大小为: 5
	0 2 3 4 5
	---------------------
	大小为: 3
	0 2 5
	---------------------
	*/
	//使用clear方法清空容器
	v3.clear();
	if(v3.empty()) 
		cout << "v3: 已清空" << endl; 
	print(v3);
	/*
	v3: 已清空
	大小为: 0
	
	---------------------
	*/
	//使用assign方法重新赋值 
	v3.assign(7, 3);
	cout << "v3: " << endl;
	print(v3);
	/*
	v3:
	大小为: 7
	3 3 3 3 3 3 3
	---------------------
	*/ 
	//使用reverse()方法反向排列, 添加algorithm头文件 
	cout << "v2: " << endl;
	for(int i = 0; i < v2.size(); ++i){
		v2[i] = i;
	} 
	print(v2);
	reverse(v2.begin(), v2.end());		//全部反向
	print(v2);
	reverse(v2.begin()+2, v2.begin()+5);//部分反向
	print(v2);
	/*
	v2:
	大小为: 9
	0 1 2 3 4 5 6 7 8
	---------------------
	大小为: 9
	8 7 6 5 4 3 2 1 0
	---------------------
	大小为: 9
	8 7 4 5 6 3 2 1 0
	---------------------
	*/
	//使用front方法查看首元素
	cout << "v2.front() = " << v2.front() << endl;
	//使用back方法查看尾元素 
	cout << "v2.back() = " << v2.back() << endl;
	//使用at方法查看某个元素
	cout << "v2.at() = " << v2.at(4) << endl; 
	/*
	v2.front() = 8
	v2.back() = 0
	v2.at() = 6
	*/
	
	return 0;
}

有新的用法在更新。。。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值