【问题标题】:Can I std::move() an element out of a std::vector?我可以从 std::vector 中 std::move() 一个元素吗?
【发布时间】:2014-04-16 19:24:02
【问题描述】:

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

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

编辑:代码示例:

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.assign(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();
}

【问题讨论】:

  • @ChrisJester-Young 我认为他们的意思是std::move。在这种情况下,迭代器仍然有效。
  • 状态未指定,而非未定义。查看副本...
  • @galop1n 不,不是。我不是在谈论移动对象后的状态。但是容器在移动其元素后的状态
  • @YZ.learner:为什么你认为搞砸一个对象会以任何方式改变容器的状态?
  • @galop1n:“扩展完全一样。” -- 不,绝对不一样。

标签: c++ c++11


【解决方案1】:

std::move 元素可以吗?

是的,没关系。

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

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

但是向量呢?

该向量处于有效且明确指定的状态,尽管其中一个元素处于未指定状态。

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

是的。当然。尽管您可以做的远不止这些。与移出的向量不同,您仍然可以指望向量具有相同的大小、相同的容量以及除刚移出的元素之外的所有元素保持不变。以及对元素(包括您刚从中移动的那个)的所有引用和迭代器仍然有效。

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 2017-10-19
    • 2010-11-13
    • 2019-07-30
    • 2021-05-05
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    相关资源
    最近更新 更多