一、clear和erase函数会把容器的实际大小减少。

void test_clear_erase()
{
	std::deque<int> de;
	for( int i = 0; i != 5; ++i )
	{
		de.push_back(i);
	}
	std::cout << de.size() << std::endl;//5
	//de.clear();
	de.erase(de.begin(),de.end());
	std::cout << de.size() << std::endl;//使用clear和erase函数后,容器大小变为0
}

二、容器的赋值“=”操作

// 测试复制操作符:
void test_assignment()
{
	std::deque<std::string> de_1;
	de_1.push_back("aaa");
	de_1.push_back("bbb");
	de_1.push_back("ccc");
	
	std::deque<std::string> de_2;
	de_2.push_back("111");
	de_2.push_back("222");
	de_2.push_back("333");
	de_2.push_back("444");
	/*
	赋值操作符首先 erases 其左操作数容器中的所有元素,然后将右操作数容器的所有元素 inserts 到左边容器中
	赋值后,左右两边的容器相等:尽管赋值前两个容器的长度可能不相等,但赋值后两个容器都具有右操作数的长度。
	赋值和 assign 操作使左操作数容器的所有迭代器失效。
	*/
	//de_1 = de_2;
	//std::cout << de_1.size() << std::endl; //4
	//print_deque(de_1); //111_222_333_444_

	de_2 = de_1;
	std::cout << de_1.size() << std::endl; //3
	print_deque(de_1); //aaa_bbb_ccc
}

三、顺序容器的赋值操作

c1 = c2删除容器 c1 的所有元素,然后将 c2 的元素复制给 c1。c1 和c2 的类型(包括容器类型和元素类型)必须相同
c1.swap(c2)交换内容:调用完该函数后,c1 中存放的是 c2 原来的元素,c2 中存放的则是 c1 原来的元素。c1 和 c2 的类型必须相同。该函数的执行速度通常要比将 c2 复制到 c1 的操作快
c.assign(b,e)重新设置 c 的元素:将迭代器 b 和 e 标记的范围内所有的元素复制到 c 中。b 和 e 必须不是指向 c 中元素的迭代器
c.assign(n,t)将容器 c 重新设置为存储 n 个值为 t 的元素

四、测试assign

assign 操作首先删除容器中所有的元素,然后将其参数所指定的新元素插入到该容器中。与复制容器元素的构造函数一样,如果两个容器类型相

同,其元素类型也相同,就可以使用赋值操作符(=)将一个容器赋值给另一个容器。如果在不同(或相同)类型的容器内,元素类型不相同但是

相互兼容,则其赋值运算必须使用 assign 函数。例如,可通过 assign 操作实现将 vector 容器中一段 char* 类型的元素赋给 string 类型 list 容器。

由于 assign 操作首先删除容器中原来存储的所有元素,因此,传递给 assign 函数的迭代器不能指向调用该函数的容器内的元素。

void test_assign()
{
	std::list<std::string> ls;
	ls.push_back("aaa");
	ls.push_back("bbb");
	ls.push_back("ccc");

	std::deque<std::string> de;
	de.assign(ls.begin(),ls.end());//把list assign到deque
	print_deque(de);//aaa_bbb_ccc_

	std::vector<std::string> vec;
	vec.push_back("111");
	vec.push_back("222");
	vec.push_back("333");

	de.assign(vec.begin(),vec.begin()+1);
	print_deque(de);//111_,左闭右开


	de.assign(5, "000");
	print_deque(de);//000_000_000_000_000_
}

五、测试swap:使用swap 操作以节省删除元素的成本

swap 操作实现交换两个容器内所有元素的功能。要交换的容器的类型必须匹配:操作数必须是相同类型的容器,而且所存储的元素类型也必须

相同。调用了 swap 函数后,右操作数原来存储的元素被存放在左操作数中,反之亦然该操作不会删除或插入任何元素,而且保证在常量时间内

实现交换。由于容器内没有移动任何元素,因此迭代器不会失效。

void test_swap()
{
	std::deque<std::string> de1;
	std::stringstream ss;
	std::string str;
	for( int i = 0; i != 5; ++i )
	{
		ss << i;
		ss >> str;
		de1.push_back(str);
		//std::cout << ss.str() << std::endl;
		ss.str("");
		ss.clear();
	}
	std::deque<std::string>::iterator it_de1 = de1.begin();

	std::deque<std::string> de2;
	de2.push_front("aaa");
	de2.push_front("bbb");
	de2.push_front("ccc");
	std::deque<std::string>::iterator it_de2 = de2.begin();

	std::cout << *it_de1 << std::endl;//0
	std::cout << *it_de2 << std::endl;//ccc
	de1.swap(de2);//交换
	std::cout << *it_de1 << std::endl;//0
	std::cout << *it_de2 << std::endl;//ccc
	print_deque(de1);//ccc_bbb_aaa_
	print_deque(de2);//0_1_2_3_4_
}






Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐