2012-02-12 52 views
2

我想創建一個具有最大元素數量的向量48,我想隨時知道向量中當前元素的數量。矢量。如何設置元素的最大數量並查找當前計數?

我用這個代碼:

.H

std::vector< CPPobject* >vec; 

.mm

int maxCountElementInVec = 48; 
vec.resize(maxCountElementInVec); 
int countElement = sizeof(vec)/sizeof(vec[0]); 

printf("%d ",countElement); // return 3 

< ...>

vec.push_back(some_cpp_obj); 
int countElement = sizeof(vec)/sizeof(vec[0]); 
if(countElement > maxCountElementInVec) printf("Evrika"); 
printf("%d ",countElement); // return 3 

CountElement始終爲3

回答

1

獲取向量中元素的數量非常簡單。請致電vec.size()。您不能限制矢量不要調整保留大小。

你查詢的是一個簡單指針大小的向量結構的大小。矢量的元素不是這個尺寸的一部分 - 因此你的尺寸不變。

3

您不能設置元素的最大數量。

長度但是與

int length = myVector.size(); 
1

檢索到的,我不認爲sizeof對STL向量在這裏做的非常有用的東西。正如Kerrek在評論中指出的那樣,它不會評估與向量中元素數量成比例的東西。只需使用size()即可獲取向量中保存的元素的當前數量。

你可以切換到EASTL,它提供fixed_vector這就像一個向量,除了所有的內存都是預先分配的,所以它不能增長到超過你指定的值。儘管如此,它仍然保持跟蹤已插入多少元素的size()

+0

當然'sizeof'的定義很明確。它爲您提供了矢量對象的大小,這與矢量對象管理的內存大小無關。 – 2012-02-12 12:33:50

+0

@KerrekSB謝謝,我把那個錯誤的方式。 – unwind 2012-02-12 12:45:14

3

使用.size()方法可以獲得元素的數量。

爲了設置一個上限,您可以通過std::vector創建一個包裝:

template<typename T> 
class MyVector : public std::vector<T> 
{ 
    int _maxSize; 
public: 
    void setMaxSize(int maxSize) {_maxSize = maxSize;} 
    void push_back(const T& element) 
    { 
     if (std::vector<T>::size() < _maxSize) 
      std::vector<T>::push_back(element); 
     else 
     { 
      //disallow - throw exception or whatever 
     } 
    } 
}; 
+1

如果MyVector上傳到std :: vector,這可能會泄漏。儘管如此,將您的繼承改爲私有(並且儘可能多地暴露std :: vector接口),並且這不會泄漏。 – U007D 2016-10-26 05:16:11

1

包裝不好。這爲內存泄漏打開了大門,因爲std :: vector沒有虛擬析構函數。

讓泄漏一些內存:

// Construct std::vector & MyVector 
std::vector * v = dynamic_cast<std::vector *>(new MyVector()); 
// Destruct only std::vector 
delete v; 

這是MyVector的建設,而不對它的調用的析構函數。

讓我們發瘋:

MyVector * mv = new MyVector(); // Construct std::vector & MyVector 

std::vector * v = dynamic_cast<std::vector *>(mv); 
delete v; // Destruct only std::vector 

mv.resize(74); // Usage of a partially destroy object. 

這是使用局部破壞對象。讓我們旋轉麻煩的輪子!

+0

是的,但沒有回答OP的問題。私有繼承或者簡單的香草封裝可以用來包裝std :: vector而不會有泄漏的風險。 – U007D 2016-10-26 05:19:30