我已经搜索了一段时间,但我找不到明确的解释来解释我的疑虑。主要:
struct foo
{
foo(int n=0) : m_n(n) {}
int m_n;
};
std::vector<foo> vec;
vec.push_back(100);
vec.push_back(55);
vec.push_back(6);
std::cout << vec.data() << std::endl; //0x1aca010
std::cout << vec.capacity() << std::endl; //4
vec.push_back(6);
vec.push_back(6);
std::cout << vec.data() << std::endl; //0x1aca050 *
std::cout << vec.capacity(); //8
*据我所知,向量是一个动态数组,它包含一个连续内存块中的数据。当我们调整它的大小,并且没有足够的空间容纳更多的元素时,就会分配新的内存块,所有元素都会复制到那个内存块。对于c++11中的移动语义,它的工作原理是一样的吗?它不是一个列表,所以指针不能只是"交换"。
为什么你认为指针不能直接"交换"?让我向您展示一个可能的实现>o<
template <typename T>
class vector
{
private:
T *mem;
// ...
public:
// ...
vector(vector &&rhs)
: vector() // delegate constructor
{
rhs.swap(*this);
}
vector &operator =(vector &&rhs)
{
rhs.swap(*this);
rhs.clear();
rhs.shrink_to_fit();
return *this;
}
void swap(vector &obj)
{
using std::swap;
swap(mem, obj.mem);
// ...
}
// ...
};
但是,如果您想使用与原始向量不同的分配器(即使用此页面的第六个构造函数),则应该分配新内存并将数据复制到其中,而不仅仅是交换指针。