gpt4 book ai didi

包含指向内部数据成员的指针容器的 C++ 类 : copying/assignment

转载 作者:太空狗 更新时间:2023-10-29 20:51:18 24 4
gpt4 key购买 nike

假设我有一个类 Widget与容器数据成员 d_members , 和另一个容器数据成员 d_special_members包含指向 d_members 的可区分元素的指针.特殊成员在构造函数中确定:

#include <vector>

struct Widget
{
std::vector<int> d_members;
std::vector<int*> d_special_members;

Widget(std::vector<int> members) : d_members(members)
{
for (auto& member : d_members)
if (member % 2 == 0)
d_special_members.push_back(&member);
}
};

实现拷贝构造函数和operator=()的最佳方式是什么?对于这样的类(class)?

  • d_special_members在拷贝中应指向 d_members 的拷贝.

  • 是否有必要重复在构造函数中完成的工作?我希望这可以避免。

  • 我可能想使用 copy-and-swap idiom .

  • 我想可以使用索引而不是指针,但在我的实际用例中 d_members有一个类似 std::vector< std::pair<int, int> > 的类型(并且 d_special_members 仍然只是 std::vector<int*> ,所以它指的是 对的元素),所以这不是很方便。

  • 只有d_members的现有内容(在施工时给出)由类(class)修改;从来没有任何重新分配(这会使指针无效)。

  • 应该可以构建Widget带有 d_members 的对象在运行时任意大小。


请注意,默认赋值/复制只是复制指针:

#include <iostream>
using namespace std;

int main()
{
Widget w1({ 1, 2, 3, 4, 5 });
cout << "First special member of w1: " << *w1.d_special_members[0] << "\n";
Widget w2 = w1;
*w2.d_special_members[0] = 3;
cout << "First special member of w1: " << *w1.d_special_members[0] << "\n";
}

产量

First special member of w1: 2
First special member of w1: 3

最佳答案

您所要求的是一种在数据移动到新内存位置时保持关联的简单方法。正如您所发现的,指针远非理想。您应该寻找的是相对的东西,例如指向成员的指针。这在这种情况下不太适用,所以我会选择我看到的最接近的替代方案:将索引存储到您的子结构中。因此,将索引存储到 vector 中,并存储一个标志,指示该对中的第一个或第二个元素(如果您的结构变得更复杂,依此类推)。

我看到的另一种选择是遍历旧对象中的数据以找出给定的特殊指针指向哪个元素——本质上是动态计算索引——然后在新对象中找到相应的元素并取它的地址。 (也许您可以使用计算来加快速度,但我不确定这是否可移植。)如果有很多查找而没有太多复制,这可能对整体性能更好。但是,我宁愿维护存储索引的代码。

关于包含指向内部数据成员的指针容器的 C++ 类 : copying/assignment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50709180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com