gpt4 book ai didi

c++ - 重载复合赋值运算符的规范方法是什么?

转载 作者:行者123 更新时间:2023-11-30 02:43:07 25 4
gpt4 key购买 nike

这似乎是个棘手的问题,因为您不能向 vector 添加新的成员函数。这种形式避免了最少的拷贝:

std::vector<T>& operator+=(std::vector<T>& lhs, const std::vector<T>& rhs)

但自赋值失败,所以唯一适用于自赋值的是:

template <typename T>
std::vector<T>& operator+=(std::vector<T>& lhs, std::vector<T> rhs)
{
lhs.insert(lhs.end(), rhs.begin(), rhs.end());
return lhs;
}

但这需要一个额外的拷贝。这样做的正确方法是什么?

在我的问题中,上述形式“不起作用”是模棱两可的,因为它们似乎适用于整数(尽管不适用于 std::strings)。有人指出这是因为它是未定义的行为。

最佳答案

问题在于:

template <typename T>
std::vector<T>& operator+=(std::vector<T>& lhs, const std::vector<T>& rhs)
{
lhs.insert(lhs.end(), rhs.begin(), rhs.end());
return lhs;
}

不是签名,它将迭代器传递给 insert,在插入完成之前变得无效。

只需使用 the correct technique for appending a vector to itself , 不需要额外的拷贝。

template <typename T>
void concat_in_place(std::vector<T>& lhs, const std::vector<T>& rhs)
{
auto left_count = lhs.size();
auto right_count = rhs.size();
lhs.resize(left_count + right_count);
std::copy_n(rhs.begin(), right_count, lhs.begin() + left_count);
}

关于c++ - 重载复合赋值运算符的规范方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26443612/

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