顺序容器:容器的赋值、swap、assign

来源:互联网 发布:公司注销,淘宝企业店铺 编辑:程序博客网 时间:2024/05/22 17:40

一、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 0
原创粉丝点击