2009-03-01 65 views
0

我有一個載入了知識數量的元素(N)的矢量。矢量調整大小 - 便攜式檢測方式

處理動態地創建新元素,這些元素附加到向量中。

我期待大約2 * N的附加元件被創建,所以 我調整矢量到3 * N.

如果附加元素超過,我想程序中止,而不是動態矢量的擴展。

有沒有一種方法來檢測,這是AIX/TRU64/Linux的便攜之間?

回答

3

檢測到什麼?矢量是否會被調整大小?是否已經?

唯一真正的方式實現這一目標是要麼在一個自定義的分配器或添加元素的向量的函數提供檢查功能。

e.g

template<class T> 
void add_element(std::vector<T>& container, T const& v) 
{ 
    if (container.capacity()+1 >= 3*N) 
    { 
    // terminate/exception/whatever 
    } 

container.push_back(v); 
} 
2

創建自己的類,將委託給向量。並檢查您自己的push_back中的大小。

2

如果你知道在編譯時的大小,也許用一個std :: TR1 ::數組(或boost::array)將是一個更好的選擇。它保持一個固定的大小,並檢查訪問像std :: vector。

然而,如果你知道它只是在運行時,如說他人在這裏,你應該封裝在與該會檢查你想要的條件,特定函數的類的載體(通過斷言例如)。在這個最後的方法中,如果你可以知道向量創建時的最大尺寸,在你的封裝類構造函數中保留(std :: vector :: reserve())向量的最大尺寸或初始化功能)。這樣,矢量本身不會有更多的內存操作(只有在矢量元素構造函數/析構函數做了這樣的操作時)。然後,添加一個簡單的斷言,檢查向量容量(std :: vector :: capacity())在類的所有函數的開始和結束時永遠不會發生變化,這有助於確保內存不會移動。

例如(假設DATA_MAX_SIZE是某處定義了默認最大尺寸):

template< typename MyType > 
class MyData 
{ 
public: 
    MyData(unsigned long max_size = DATA_MAX_SIZE) 
     : m_max_size(max_size) 
     { m_data.reserve(m_max_size); } 

    void add(const MyType& value) { check_capacity(); m_data.push_back(value); check_capacity(); } 



private: 

    std::vector<MyType> m_data; 
    const unsigned long m_max_size; 

    void check_capacity() { if(m_data.capacity() != m_max_size) throw Exception("Useful error message here!"); } 

}; 

或者類似的東西...

3

你爲什麼要使用一個矢量?矢量的全部要點是在需要時動態擴展。

而不是使一類委託給矢量的,只是做一個類委託給一個簡單的數組。讓你的push_back在需要時檢查大小並中止。

2

std類使用每次插入元素時調用的分配器。您可以編寫一個從std :: alocator繼承的新分配器,並添加所需的所有類型的檢查/跟蹤。

(我這樣做過,但我花了一段時間,使工作的代碼。)

+1

分配器不一定每次都被調用,向量只會在需要增長容量時使用它,而不是大小 – 2017-03-15 21:19:44