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

What is the right way of copying string set (in copy constructor and assignment operator)?

本文关键字:复制 构造函数 赋值运算符 是什么 字符串 方法      更新时间:2023-10-16

代码块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、 字符串集的复制是不同的。

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

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

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

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

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