顺序容器:容器的赋值、swap、assign
一、clear和erase函数会把容器的实际大小减少。void test_clear_erase(){std::deque de;for( int i = 0; i != 5; ++i ){de.push_back(i);}std::cout << de.size() << std::endl;//5//de.clear();de.erase(de.
一、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_ }
更多推荐
所有评论(0)