1007vector01

93 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情

1.vector数据存取概述

功能描述:

  • 对vector中的数据的存取操作

函数原型:

  • at(int idx); //返回索引idx所指的数据
  • operator[]; //返回索引idx所指的数据
  • front(); //返回容器中第一个数据元素
  • back(); //返回容器中最后一个数据元素

2.代码举例说明示例:

#include <vector>

void test01()
{
	vector<int>h;
	for (int i = 0; i < 10; i++)
	{
		h.push_back(i);
	}

	for (int i = 0; i < v1.size(); i++)
	{
		cout << h[i] << " ";
	}
	cout << endl;

	for (int i = 0; i < h.size(); i++)
	{
		cout << h.at(i) << " ";
	}
	cout << endl;

	cout << "h的第一个元素为: " << h.front() << endl;
	cout << "h的最后一个元素为: " << h.back() << endl;
}

int main() {

	test01();

	system("pause");

	return 0;
}

总结:

  • 除了用迭代器获取vector容器中元素,[ ]和at也可以
  • front返回容器第一个元素
  • back返回容器最后一个元素

3. vector互换容器概述

功能描述:

  • 实现两个容器内元素进行互换

函数原型:

  • swap(vec); // 将vec与本身的元素互换

4.代码举例说明

#include <vector>

void printVector(vector<int>& h) {

	for (vector<int>::iterator it = h.begin(); it != h.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

void test01()
{
	vector<int>h01;
	for (int i = 0; i < 10; i++)
	{
		h01.push_back(i);
	}
	printVector(h01);

	vector<int>h01;
	for (int i = 10; i > 0; i--)
	{
		h02.push_back(i);
	}
	printVector(h02);

	//互换容器
	cout << "互换后" << endl;
	h01.swap(h02);
	printVector(h01);
	printVector(h02);
}

void test02()
{
	vector<int> h;
	for (int i = 0; i < 100000; i++) {
		h.push_back(i);
	}

	cout << "h的容量为:" << h.capacity() << endl;
	cout << "h的大小为:" << h.size() << endl;

	h.resize(3);

	cout << "h的容量为:" << h.capacity() << endl;
	cout << "h的大小为:" << h.size() << endl;

	//收缩内存
	vector<int>(h).swap(h); //匿名对象

	cout << "h的容量为:" << h.capacity() << endl;
	cout << "h的大小为:" << h.size() << endl;
}

int main() {

	test01();

	test02();

	system("pause");

	return 0;
}

结论: swap可以使两个容器互换,可以达到实用的收缩内存效果

5. vector预留空间概述

功能描述:

  • 减少vector在动态扩展容量时的扩展次数

函数原型:

  • reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。

6.代码举例说明

#include <vector>

void test01()
{
	vector<int> h;

	//预留空间
	h.reserve(100000);

	int num = 0;
	int* p = NULL;
	for (int i = 0; i < 100000; i++) {
		h.push_back(i);
		if (p != &h[0]) {
			p = &h[0];
			num++;
		}
	}

	cout << "num:" << num << endl;
}

int main() {

	test01();
    
	system("pause");

	return 0;
}

结论: 如果数据量较大,可以一开始利用reserve预留空间

7.vector与普通数组的区别:

  • 数组是静态空间,而vector可以动态拓展。

  • 数组静态空间:数组在声明时即指定了大小。无法再改变。

  • vector动态拓展:并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝到新空间中,释放原空间。

  • 动态拓展机制:类似于C#种的ArrayList的Capacity拓展,当空间不足时,自动开辟。ArrayList会自动翻倍,但是vector不会翻倍,他会增加当前容量的一半。