2014-09-02 92 views
-2

我一直在尋找一段時間,但我找不到明確的解釋我的疑惑。 主要是:向量移動語義C++ 11

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中的移動語義相同?這不是一個列表,所以指針不能只是「交換」。

+1

這裏沒有移動操作,在C++ 11中它應該以相同的方式工作。 – 2014-09-02 09:47:43

回答

0

爲什麼你認爲指針不能被「交換」?讓我告訴你一個可能的實現> 0 <

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

但是,如果你想使用一個不同的分配從原來的載體(即使用的this page第六構造函數),你應該分配新的內存和複製數據進入它,不只是交換指針。

+0

我明白,在某些情況下,指針可能只是「交換」,這是移動點,但它在這種情況下工作嗎? – Suprido 2014-09-02 10:16:41

+0

@AdamAdamowicz什麼是'這種情況'?你不是在說移動語義嗎? – ikh 2014-09-02 10:28:07

+0

「在這種情況下」我的意思是調整矢量大小。我只想知道向量的實現是否將前一個塊的所有元素複製到新分配的塊中。 – Suprido 2014-09-02 10:38:49