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

GuL*_*arn 18 c++ c++11

我有一个std::vector<std::string>要在循环中重复使用.它是确定std::move的元素呢?如果我将第i个元素移出,那么ith 插槽将进入一个未定义但有效的状态,但是矢量呢?它的状态是否仍然有效且有效?另外,我可以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();
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*ley 24

std :: move元素可以了吗?

是的,没关系.

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

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

但是矢量怎么样?

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

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

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