5

可能重复:
移动向量是否会使迭代器无效?

考虑以下代码:

std::vector<T> prepare(T*& data) {
    std::vector<T> buffer;
    // Fill in buffer.
    data = buffer.data();
    return buffer;
}

...

T* data;
auto vec = prepare(data);
// line 12

有可能vec.data() != data在第12行吗?相似地,

std::vector<T> buffer;
// ... Fill in buffer ...
T* data = buffer.data();
auto vec = std::move(buffer);
// line 5

有可能vec.data() != data在第5行吗?

实际上两者在 libstdc++ 和 libc++ 的实现中都是不可能的,因为移动构造函数被实现为简单的指针赋值,但似乎标准没有指定任何内容(类似于移动 std 时需要保留的容量: :向量?)。“恒定的复杂性”可以保证vec.data() == data吗?

4

1 回答 1

0

恒定的复杂性意味着容器不允许复制/移动单个元素,因此它必须将现有存储的所有权转移给新对象,因此返回的指针data()必须相同。

对于移动分配(而不是移动构造),仅当propagate_on_container_move_assignment向量的分配器类型为真或分配器比较相等时才为真。

于 2012-12-28T15:09:24.780 回答