我有一个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();
}
答案 0 :(得分:24)
std ::移出元素可以吗?
是的,没关系。
如果我将第i个元素移出,那么ith插槽将进入未定义状态 但是有效的状态
它使元素处于有效但未指定的状态。这两个词之间的区别在C ++中很重要,但对这个问题可能并不重要。我想我应该指出来。
但是矢量呢?
向量处于有效且指定良好的状态,但其中一个元素处于未指定状态。
另外,我可以清除()然后在下一次迭代中重用向量吗?
是。当然。虽然你可以做更多的事情。与移动向量不同,您仍然可以依赖具有相同大小,相同容量的向量,以及除刚刚移动的元素之外的所有元素保持不变。除了元素的所有引用和迭代器(包括刚刚移动的元素)仍然有效。