c++ STL 容器 中 swap的使用

c++ STL 容器 中 swap的使用

vector容器中swap的使用

主要涉及以下内容:

  • size 和 capacity 区别
  • swap的基本用法
  • swap在缓存队列中的使用

可以从下面代码中查看上述内容的解释

#include <iostream>
#include <vector>

#include <stdio.h>

void  printVector(std::vector<int> v)
{
	for (auto inter = v.begin(); inter != v.end();inter++)
	{
		printf("%d\n", *inter);
	}
}


int swap_usage()
{
	std::vector <int> v1;
	v1.push_back(10);
	v1.push_back(20);
	std::vector<int> v2;
	v2.push_back(30);

	printf("交换之前:\n");
	printf("v1容器内容:\n");
	printVector(v1);
	printf("v2容器内容:\n");
	printVector(v2);
	
	v1.swap(v2);
	printf("交换之后:\n");
	printf("v1容器内容:\n");
	printVector(v1);
	printf("v2容器内容:\n");
	printVector(v2);
	
	return 0;
}

int size_capacity()
{
	std::vector<int> v1;
	printf("-----------v1-------------\n");
	for(int i = 0; i < 20;i++)
	{
		v1.push_back(i);
		printf("v1 size %lu capacity %lu \n", v1.size(),v1.capacity());
	}
	printf("--------------------------\n");

	std::vector<int> v2;
	printf("------------v2------------\n");
	v2.resize(20);
	for (int i = 0; i < 40; i++)
	{
		v2.push_back(i);
		printf("v2 size %lu capacity %lu \n", v2.size(), v2.capacity());
	}
	printf("--------------------------\n");
	printf("--------v2.resize(5)------\n");
	v2.resize(5);
	// 通过发现resize 之后capacity 容量并没有发生变化,空间并没有释放。
	printf("v2 size %lu capacity %lu \n", v2.size(), v2.capacity());
	// 不会报错,
	v2[6] = 6;
	v2[79] = 79;
	v2[80] = 80;
	v2[81] = 81;
	v2[160] = 160;
	// 会报错 at 会进行边界检查
	//v2.at(6) = 6;
	//v2.at(79) = 79;	
	//v2.at(80) = 80;
	//v2.at(81) = 81;
	//v2.at(160) = 160;
	// 利用 swap 进行交换 ,这个方式可以利用应用在缓存队列中,比如 正常队列 v1 - > v2 -> v3 
	//可以做成多级的缓存队列通过 swap的方式来进行各个队列之间的数据交换
	std::vector<int> v3;
	v3.resize(10);
	printf("-------------swap 之前 -------------\n");
	printf("v2 size %lu capacity %lu \n", v2.size(), v2.capacity());
	printf("v3 size %lu capacity %lu \n", v3.size(), v3.capacity());
	v3.swap(v2);

	printf("-------------swap 之后 -------------\n");
	printf("v2 size %lu capacity %lu \n", v2.size(), v2.capacity());
	printf("v3 size %lu capacity %lu \n", v3.size(), v3.capacity());

}

int main(void)
{
	swap_usage();
	size_capacity();
	return 0;
}

运行结果如下:


-----------v1-------------
v1 size 1 capacity 1 
v1 size 2 capacity 2 
v1 size 3 capacity 4 
v1 size 4 capacity 4 
v1 size 5 capacity 8 
v1 size 6 capacity 8 
v1 size 7 capacity 8 
v1 size 8 capacity 8 
v1 size 9 capacity 16 
v1 size 10 capacity 16 
v1 size 11 capacity 16 
v1 size 12 capacity 16 
v1 size 13 capacity 16 
v1 size 14 capacity 16 
v1 size 15 capacity 16 
v1 size 16 capacity 16 
v1 size 17 capacity 32 
v1 size 18 capacity 32 
v1 size 19 capacity 32 
v1 size 20 capacity 32 
--------------------------
------------v2------------
v2 size 21 capacity 40 
v2 size 22 capacity 40 
v2 size 23 capacity 40 
v2 size 24 capacity 40 
v2 size 25 capacity 40 
v2 size 26 capacity 40 
v2 size 27 capacity 40 
v2 size 28 capacity 40 
v2 size 29 capacity 40 
v2 size 30 capacity 40 
v2 size 31 capacity 40 
v2 size 32 capacity 40 
v2 size 33 capacity 40 
v2 size 34 capacity 40 
v2 size 35 capacity 40 
v2 size 36 capacity 40 
v2 size 37 capacity 40 
v2 size 38 capacity 40 
v2 size 39 capacity 40 
v2 size 40 capacity 40 
v2 size 41 capacity 80 
v2 size 42 capacity 80 
v2 size 43 capacity 80 
v2 size 44 capacity 80 
v2 size 45 capacity 80 
v2 size 46 capacity 80 
v2 size 47 capacity 80 
v2 size 48 capacity 80 
v2 size 49 capacity 80 
v2 size 50 capacity 80 
v2 size 51 capacity 80 
v2 size 52 capacity 80 
v2 size 53 capacity 80 
v2 size 54 capacity 80 
v2 size 55 capacity 80 
v2 size 56 capacity 80 
v2 size 57 capacity 80 
v2 size 58 capacity 80 
v2 size 59 capacity 80 
v2 size 60 capacity 80 
--------------------------
--------v2.resize(5)------
v2 size 5 capacity 80 
-------------swap 之前 -------------
v2 size 5 capacity 80 
v3 size 10 capacity 10 
-------------swap 之后 -------------
v2 size 10 capacity 10 
v3 size 5 capacity 80 

©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:上身试试 返回首页