我可以从std :: vector中std :: move()一个元素吗?

时间:2014-04-16 19:24:03

标签: c++ c++11

我有一个std::vector<std::string>要在循环中重复使用。 std::move元素可以了吗?如果我将第i个元素移出,那么ith slot 会进入一个未定义但有效的状态,但该向量怎么办?它的状态是否仍然有效且有效?另外,我可以clear()然后在下一次迭代中重用该向量吗?

编辑:请在标记复制之前阅读问题。我在v2之后询问std::move(v2[0])的状态,而不是std::move(v2)。我在v2之后再次使用v2.clear()。这与建议的复制有何相似之处?

编辑:代码示例:

struct Foo {
    string data;
    /* other data memebers */
    void workOnData();
}

std::vector<std::string> buffer;
Foo foo;
while (1) {
    buffer.clear();
    loadData(buffer); // push data to buffer, at least one element in buffer guaranteed
    foo.data.assing(std::move(buffer[0])); // please don't ask is Foo necessary or why workOnData has to be a member method. THIS IS A SIMPLIFIED EXAMPLE!
    foo.workOnData();
}

1 个答案:

答案 0 :(得分:24)

  

std ::移出元素可以吗?

是的,没关系。

  

如果我将第i个元素移出,那么ith插槽将进入未定义状态   但是有效的状态

它使元素处于有效但未指定的状态。这两个词之间的区别在C ++中很重要,但对这个问题可能并不重要。我想我应该指出来。

  

但是矢量呢?

向量处于有效且指定良好的状态,但其中一个元素处于未指定状态。

  

另外,我可以清除()然后在下一次迭代中重用向量吗?

是。当然。虽然你可以做更多的事情。与移动向量不同,您仍然可以依赖具有相同大小,相同容量的向量,以及除刚刚移动的元素之外的所有元素保持不变。除了元素的所有引用和迭代器(包括刚刚移动的元素)仍然有效。