【问题标题】:STL container of structure having character array elements具有字符数组元素的结构的 STL 容器
【发布时间】:2020-06-25 12:11:10
【问题描述】:

假设我的结构如下所示 -

struct Member
{
    Membe(char* member1In, char* member2In)
    {
       strcpy(member1, member1In);
       strcpy(member2, member2In);
    }
    char member1[10];
    char member2[10];
};

和 std::vector 声明为

std::vector<Member> members{};

我使用emplace_back() 插入值,如下所示

members.emplace_back(value1, value2);

所以我的问题是当阵列超出容量时,它必须移动到其他位置。谁将为成员结构分配内存?我是否必须编写自己的副本、赋值和移动操作或提供的编译器就足够了?默认提供的操作会做浅拷贝并产生问题吗?

【问题讨论】:

  • 注意char member1[10] 不是指针,它是一个数组。数据直接存储在对象中,没有间接性,也没有浅拷贝做错事的危险。
  • 你的构造函数有错别字,应该是“Member”而不是“Membe”
  • 注意将数组作为指针传递是容易出错的,std::array 是你的朋友,或者在你的情况下甚至 std::string 或 std::string_view 取决于你是否真的需要复制数据

标签: c++ c++11 vector stl


【解决方案1】:

谁来为成员结构分配内存?

std::vector 将使用您提供的分配器分配内存(隐式使用默认参数)。

我是否必须编写自己的复制、赋值和移动操作或提供的编译器就足够了?

编译器提供的就够了。

默认提供的操作会做浅拷贝

是的,尽管这取决于浅拷贝的含义。浅拷贝和深拷贝的区别只对引用类型有意义。

然后制造问题?

没有。你的类不包含指针/引用/迭代器,所以没有什么可以被深度复制,也没有问题。

【讨论】:

    【解决方案2】:

    向量将分配必要的内存。

    对于某些类,您需要编写一个复制构造函数等。但即使您没有在向量中使用该类也是如此。

    但是,对于您的类,默认的复制构造函数将正常工作。简单的经验法则是,如果你的类需要一个析构函数,那么它还需要一个复制构造函数和一个赋值运算符。这就是所谓的三法则。

    【讨论】:

      猜你喜欢
      • 2017-10-11
      • 2018-03-17
      • 2017-06-12
      • 2012-06-19
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      相关资源
      最近更新 更多