左雪菲的专栏

欢迎访问我的个人网站:http://www.hootina.org

std::copy()和std::back_inserter()用法

#include "stdafx.h"
#include <vector>
#include <iterator>     //包含了std::back_inserter的定义

class A
{
public:
    A()
    {
        t = 9;
    }

    ~A()
    {
        t = 7;
    }

private:
    int t;
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<int> v1(3, 10);
    std::vector<int> v2(4, 9);
    std::copy(v1.begin(), v1.end(), v2.begin());
    std::vector<int> v3(1);
    //下列这行代码会导致程序崩溃,因为目标容器v3的大小必须大于等于源容器的大小v1
    //std::copy(v1.begin(), v1.end(), v3.begin());
    //为了解决这个问题可以使用std::back_inserter()函数。
    std::copy(v1.begin(), v1.end(), std::back_inserter(v3));

    std::vector<A*> v4;
    v4.push_back(new A());
    v4.push_back(new A());
    v4.push_back(new A());

    std::vector<A*> v5(4);
    //不会引起新元素的构造函数执行,这样v5中的元素如果不显式delete会不会引起内存泄露?
    std::copy(v4.begin(), v4.begin() + 1, v5.begin());

    std::vector<A> v6;
    A a;
    v6.push_back(a);
    v6.push_back(a);
    v6.push_back(a);
    std::vector<A> v7(4);
    //向v7中复制元素不会引起新元素的构造函数执行
    std::copy(v6.begin(), v6.begin() + 1, v7.begin());

    return 0;
}

如果不使用std::copy达到同样的效果,则必须先clear或者erase方法,这可能会引起旧元素的析构和新元素的构造。
需要注意两点:
1、如果不使用std::back_inserter,则要保证目标容器的大小不小于源容器;
2、只有实现了push_back的目标容器才可以使用std::copy复制,不然无法编译通过。

参考:http://blog.chinaunix.net/uid-22671442-id-3502337.html

阅读更多
版权声明:欢迎访问我的个人网站:http://www.hootina.org https://blog.csdn.net/analogous_love/article/details/51218934
个人分类: stl
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭