C++学习笔记_15_vector简单用法

C++学习笔记_15_容器

官方文档在这看

文章目录

  • C++学习笔记_15_容器
  • 容器的选取
  • 一、vector是什么?
  • 二、vector构造函数
  • 三、vector的遍历方式
  • 四、容量空间
  • 五、vector增删查改
  • 补充
    • 1.在通过迭代器拷贝的时候,类型必须一致
    • 2.vector < string >
    • 3.vector< char > vstr
    • 4.习题链接


容器的选取

  1. 随机访问元素:Vector
  2. 中间插入或删除:list、forword_list
  3. 头尾插入删除,但不在中间插入删除:deque

如果不确定,尽量使用Vecotr

一、vector是什么?

按照官方文档的话说,vector是可变大小数组的序列容器,可以理解成一个类似于数组的形式,可以采用下标对vector的元素进行访问,但又不是数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

二、vector构造函数

vector的构造有一下几种:

	vector<int> v1;//无参
	vector<int> v2(10, 3);//10个val,val==3
	vector<int> v3(v2);//拷贝构造
	vector<int> v4(v3.begin(), v3.end());//迭代器
	
	vector<int> v5(12345678);//不算

测试代码如下:

	cout << "v1 : ";
	vector<int> v1;//无参
	for (size_t i = 0; i < v1.size(); i++)
	{
     
		cout << v1[i] << " ";
	}
	cout << endl;

	cout << "v2 : ";
	vector<int> v2(10, 3);//10个val,val==3
	for (size_t i = 0; i < v2.size(); i++)
	{
     
		cout << v2[i] << " ";
	}
	cout << endl;
	
	cout << "v3 : ";
	vector<int> v3(v2);
	for (size_t i = 0; i < v3.size(); i++)
	{
     
		cout << v3[i] << " ";
	}
	cout << endl;
	
	cout << "v4 : ";
	vector<int> v4(v3.begin(), v3.end());
	for (size_t i = 0; i < v4.size(); i++)
	{
     
		cout << v4[i] << " ";
	}
	cout << endl;
	
	//12个0
	cout << "v5 : ";
	vector<int> v5(12);
	for (size_t i = 0; i < v5.size(); i++)
	{
     
		cout << v5[i] << " ";
	}
	cout << endl;

结果:
在这里插入图片描述
所以v5的方式不符合正常逻辑,因此不属于正常构造方式。

三、vector的遍历方式

与string类似:

  1. for+operator[],在上面构造的时候已经使用过。
  2. 迭代器
	vector<int> v2(10, 3);
	vector<int>::iterator it2 = v2.begin();
	while (it2 != v2.end())
	{
     
		cout << *it2 << " ";
		++it2;
	}
	cout << endl;

在这里插入图片描述
3. 范围for

	vector<int> v2(10, 3);
	for (auto v : v2)
		cout << v << " ";

代码简单,结果与前面一样。
推荐熟悉了以后,多用auto遍历。

四、容量空间

  1. size 返回数据个数
  2. capacity 返回容量大小
  3. resize修改size大小
  4. reserve改变vector放入capacity
  5. empty判断是否为空

通过代码测试用法:

	vector<int> v1(10,2);

	cout << "v1.size() = " << v1.size() << endl;
	cout << "v1.capacity() = " << v1.capacity()<< endl;
	v1.resize(5);
	cout << "v1.size() = " << v1.size() << endl;
	cout << "v1.capacity() = " << v1.capacity()<< endl;
	v1.reserve(15);
	cout << "v1.size() = " << v1.size() << endl;
	cout << "v1.capacity() = " << v1.capacity()<< endl;
	cout<<v1.empty()<<endl;
  • 开10个空间,每个放入2,此时size、capacity都是10;
  • resize之后,size改变,capacity不变;
  • reserve之后,size不变,capacity改变;
    结果:
    C++学习笔记_15_vector简单用法_第1张图片

小测试说明vector的容量变化:

	size_t sz;
	std::vector<int> v;
	sz = v.capacity();
	std::cout << "making v grow:\n";
	for (int i = 0; i < 100; ++i) {
     
		v.push_back(i);
		if (sz != v.capacity()) {
     
			sz = v.capacity();
			std::cout << "capacity changed: " << sz << '\n';
		}
	}
	return 0;

证明在VS中约1.5倍扩容,g++中约2倍
C++学习笔记_15_vector简单用法_第2张图片

五、vector增删查改

  • push_back 尾插
  • pop_back 尾删
  • find 查找
  • insert 在pos之前插入val
  • erase 删除pos上的val
  • swap 交换数据空间
  • operator[] 像数组一样访问
    测试代码:
int main()
{
     
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);	
	v.push_back(5);
	v.push_back(6);
	v.push_back(7);
	v.push_back(8);
	for (auto s : v)
	{
     
		cout << s << " ";
	}
	cout << endl;
	v.pop_back();
	v.pop_back();
	for (auto s : v)
	{
     
		cout << s << " ";
	}
	cout << endl;

	vector<int>::iterator pos = find(v.begin(), v.end(), 3);

	v.insert(pos, 9);
	vector<int>::iterator it = v.begin();
	while (it != v.end()) {
     
		cout << *it << " ";
		++it;
	}
	cout << endl;
	pos = find(v.begin(), v.end(), 4);
	// 删除pos位置的数据
	v.erase(pos);
	it = v.begin();
	while (it != v.end()) {
     
		cout << *it << " ";
		++it;
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

补充

1.在通过迭代器拷贝的时候,类型必须一致

	list<int> lt(5, 3);
	vector<int> v4(lt.begin(), lt.end());

2.vector < string >

为什么使用&(引用)和const

	vector<string> v;
	v.push_back("kris");
	v.push_back("zgz");
	///for (auto s : v)
	{
     
		cout << s << " ";
	}
	cout << endl;*///不断存在深拷贝

	//解决
	for (const auto & s : v)
	{
     
		cout << s << " ";
	}
	cout << endl;

	vector<vector<string>> vv;//在这体现更明显

在这里插入图片描述

3.vector< char > vstr

vector<char> vstr;
string str;

区别:

  • string更好配合,如:strcpy(buff, str.c_str());
  • 支持:+=、 比较大小等

4.习题链接

1.只出现一次的数字
2.杨辉三角

你可能感兴趣的:(C++,c++,算法)