C++基础-补漏日记11(vector容器使用及方法)

发布于:2022-07-24 ⋅ 阅读:(285) ⋅ 点赞:(0)

目录

vector容器

         vector容器构造函数

         vector容器赋值操作

         vector容器容量和大小操作

         vector插入与删除操作

        访问vector容器中的元素

        vector容器内元素互换

实例:收缩内存

        为vector预留空间

待解决 传参


vector容器

·单端数组

·与数组相似。数组是静态空间,容器是动态空间。

动态拓展:找到更大的空间,将原数据拷贝过去,释放原空间。

常用迭代器

**从前往后**

begin:容器的第一个元素位置

end:容器最后一个元素位置的后一个位置

**从后往前**

rbegin:容器的最后一个元素

rend:容器第一个元素的前一个位置

 vector容器构造函数

1.无参构造

	vector<int> v;//无参构造
	int i = 0;
	while (i < 10) {
		v.push_back(i);
		i++;
	}

2.区间构造

	vector<int> v2(v.begin(),v.end());//区间构造

3.n个元素构造

vector<int> v2(10,100);//区间构造,将10个100添加进容器中

4.拷贝构造函数

vector<int> v2(v);//拷贝构造,v见第一条

  vector容器赋值操作

1.operator=

	vector<int> v2;
	v2 = v;

2.assign方法

	vector<int> v2;
	v2.assign(v.begin(), v.end());

3.n个元素赋值法

	vector<int> v2;
	v2.assign(10,100);

  vector容器容量和大小操作

(1)v.empty()        判断容器是否为空(空返回0,否则返回1)

(2)v.capacity()        “容量”比“大小”大   扩容 大多少由算法决定

(3)v.resize(n)        设定容量大小。若重新指定比原来长,默认用0填充。短了,超出部分会被删除。

(4)v.resize(n,num)        设定容量大小。若重新指定比原来长,用num填充

  vector插入与删除操作

1.尾部插入。尾部插入一个元素。(x对应容器的类型)

    v.push_back(x); 

2.尾部删除。删除最后一个元素。

	v.pop_back();

3.insert插入。在第一个元素前插入一个元素

	v.insert(v.begin(), x);//在第一个元素前插入一个x
	v.insert(v.begin(),n, x);//在第一个元素前插入n个x

4.erase删除。

v.erase(v.begin(), v.end());//从头到尾所有元素全部删除

访问容器中的元素

初始化

	vector<int> v;
	int i = 0;
	while (i < 10) {
		v.push_back(i);
		i++;
	}

1.[ ]方式

	for (int i = 0; i < 10; i++)
		cout << " " << v[i];

2.at方法

	for (int i = 0; i < 10; i++)
		cout << " " << v.at(i);

3.访问头部元素

	cout << v.front();

4.访问尾部元素

	cout << v.back();

两容器内元素互换

	v1.swap(v);//v和v1是两个容器

实例:收缩内存

(1)一开始大小100,容量会开到130+。

重新设定容器大小,设为10。此时容器大小为10,但容量仍为130+。

(2)若执行自我swap后,此时容器的大小为10,且容量也为10,节省了内存。

图1 未执行swap,容量仍是13

图2 执行了swap,容量变成5,与容器大小相同。

 原理:

vector<int>(v) 匿名对象 容量5大小5

容器v 容量13大小10

容器v是个指针,swap后指向匿名对象所指的区域,所以容量5,大小5

预留空间

	vector<int> v;
	int num = 0;
	int* p = NULL;
	for (int i = 0; i < 100; i++) {
		v.push_back(i);
		if (p != &v[0]) {//如果指针不是指向首地址,要么初始化未指定,要么拓展了空间
			p = &v[0];//让它指向
			num++;//拓展次数+1
		}
	}
	cout << num;//统计拓展空间次数

 运行结果:13

指拓展了13次空间

  

开辟空间语句

	v.reserve(100);

 一开始预留好了空间,就不用额外开辟。


 一开始开了50的空间,则需要额外开辟3次。

待解决 传参

 容量大小不是13吗?


网站公告

今日签到

点亮在社区的每一天
去签到