gpt4 book ai didi

c++ - 不使用元素复制赋值运算符复制 vector - 可移植性

转载 作者:搜寻专家 更新时间:2023-10-31 00:11:33 26 4
gpt4 key购买 nike

如果我有这样的类型:

class Foo {
public:
Foo();
Foo(const Foo&);
Foo& operator=(const Foo&) = delete;

...
private:
...
};

我有两个这种类型的 vector :

std::vector<Foo> x;
std::vector<Foo> y;

我想复制x的内容至 y , 是否有跨平台的方法?

VC++ 将使用 y.assign(x.begin(), x.end()) 来完成此操作,它使用 Foo的复制构造函数而不是删除的复制赋值运算符。但是 GCC 提示缺少复制赋值操作符,你是否尝试 y = xy.assign(x.begin(), x.end()) .

有什么方法可以同时适用于这两种情况吗?

最佳答案

标准要求 y.assign(it1, it2) 工作,元素类型 TCopyAssignable。也就是说,可复制构造和可赋值。您的类型不可分配,因此您不能依赖 assigny = x 也是如此。该标准第23.2.3节描述了各种序列容器操作的要求。

如果你有一个现有的 vector y,你可以构造一个新的 vector z然后用y交换它:

{
std::vector<Foo> z(x.begin(), x.end());
z.swap(y);
}

这使用范围构造函数,它只需要 TEmplaceConstructible,不需要赋值运算符!然后,您可以交换底层内存而无需任何其他拷贝。

请注意,这可能会导致更大的内存使用量,因为 y 的任何现有内容将持续存在,直到新交换的 z 超出范围。您可以尝试通过先做来减轻这种情况

y.clear();
y.shrink_to_fit();

尽管 shr​​ink_to_fit() 只是一个请求,您的库实现可能不会兑现。

[ Live demo ]

关于c++ - 不使用元素复制赋值运算符复制 vector - 可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33734456/

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