【发布时间】:2018-01-06 08:39:25
【问题描述】:
假设我有一个容器,为了论证,我们假设一个向量:
std::vector<T> v;
并假设我的类型“T”有一个移动 ctor:
T(T&& move_from) noexcept //...implementation
但是我没有移动赋值运算符。
是否可以将类型 T 的值移动到向量内某个索引处的位置?类似于我可以在两个元素之间或最后通过移动它来插入元素的方式:
v.emplace(std::move(value));
v.emplace_back(std::move(value));
...每个人似乎都建议替换矢量元素的一种方法是使用:
v.at(index) = value;
但是,什么必然会调用复制ctor(或者操作符=复制被规范地调用)。
我想到在所需索引处的元素和我希望移动的值上使用std::swap,但是,这似乎有点浪费,因为我不再需要我要替换的值如果我没有在我的班级上定义swap(),std::swap 似乎只是调用了两个元素的复制 ctor……这只会使整个事情的成本增加一倍。
一般来说,应该如何在向量和 stl 容器中的索引处移动元素(如果可以推广的话)?有什么理由不应该首先做到这一点?
注意,我问的是如何在只定义了标准移动 ctor 的类型上实现这一点,如果我在类型上定义一个 swap() ,我可以看到它变得相当容易。但是,交换方法的存在似乎并不常见,所以我宁愿避免这种情况......更不用说当该方法不可用时,我必须要么用 sfinae 解决这个问题(这将使代码不可读)或遭受对复制 ctor 的双重调用的惩罚。
【问题讨论】:
-
emplace也可以,但是它将插入点之后的元素向后移动一个槽。 -
简单的
v[i] = std::move(value)怎么样? -
@David Haim 在下面提到,该问题的假设是未定义所述运算符。应该在帖子中提到...将编辑
标签: c++ vector stl move-semantics c++17