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

一、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_
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值