一、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_
}