c++ - 复制字符串集的正确方法是什么(在复制构造函数和赋值运算符中)?

标签 c++ string copy-constructor deep-copy shallow-copy

代码块 A:

typedef struct NAMEOFTHESTRUCT {
    long lNumber;
    std::set<wstring> szStrings;

    NAMEOFTHESTRUCT() {
        lNumber = -1L;
    };

    NAMEOFTHESTRUCT(const NAMEOFTHESTRUCT& src) {
        lNumber = src.lNumber;
        szStrings = src.szStrings; //COPY THIS WAY
    };

    NAMEOFTHESTRUCT& operator =(const NAMEOFTHESTRUCT& src) {
        lNumber = src.lNumber;
        szStrings. = src.szStrings; //COPY THIS WAY
        return *this;
    };
}

代码块 B:

typedef struct NAMEOFTHESTRUCT {
    long lNumber;
    std::set<wstring> szStrings;

    NAMEOFTHESTRUCT() {
        lNumber = -1L;
    };

    NAMEOFTHESTRUCT(const NAMEOFTHESTRUCT& src) {
        lNumber = src.lNumber;
        if (!src.szStrings.empty()) // COPY THIS WAY
            szStrings.insert(src.szStrings.begin(), src.szStrings.end());
    };

    NAMEOFTHESTRUCT& operator =(const NAMEOFTHESTRUCT& src) {
        lNumber = src.lNumber;
        if (!src.szStrings.empty()) // COPY THIS WAY
            szStrings.insert(src.szStrings.begin(), src.szStrings.end()); 
        return *this;
    };
}

在代码块A和B中,字符串集的复制是不同的。

复制字符串集的正确方法是什么?为什么?

如果复制是在复制构造函数/赋值运算符中进行,有什么不同吗?如果是,为什么?

最佳答案

你应该相信赋值,它在类型中实现并且知道最有效的方法。除此之外,第二个版本的赋值运算符是错误的,因为它会将集合中的值从右侧合并到左侧。也许您打算先清除它?

除此之外,复制构造函数通常拼写为:

NAMEOFTHESTRUCT(const NAMEOFTHESTRUCT& src)
   : lNumber(src. lNumber), szStrings(src. szStrings)
{}

关于c++ - 复制字符串集的正确方法是什么(在复制构造函数和赋值运算符中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28733925/

相关文章:

C++ - 值意外更改

c++ - 校验数字的递归函数

c++ - 对静态 constexpr char[] 的 undefined reference

c++ - C 项目 O 文件在 make 期间删除后仍在寻找 Cpp 文件

python - 在Python中打印变量的名称而不是它的值

C编程: ouput two strings as two columns next to each other

ruby - 不能将数组元素连接成一个字符串?

java - 复制构造函数是否需要复制互斥体?

c++ - 使用匿名对象时,默认构造函数和复制构造函数都不会被调用

c++ - 为什么连续的 vector::push_back 会导致不同数量的构造函数调用?