2012-02-12 9 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

要素の最大数を設定することはできません。

長さは、しかし、私は、STLベクトルのsizeofはここに非常に有益な何かをやっているとは思わない

int length = myVector.size(); 
1

で取得されています。コメントでKerrekによって指摘されているように、ベクトルの要素の数に比例するものは評価されません。ベクトルに保持されている要素の現在の数を取得するには、size()を使用してください。

fixed_vectorを提供するEASTLに切り替えることができます。これはベクターと同じように、すべてのメモリが前もって割り当てられていることを除いて、指定したもの以上に拡大することはできません。しかし、まだ挿入されている要素の数を追跡して、size()を維持しています。

+0

もちろん、「sizeof」は明確に定義されています。これはベクトルオブジェクトのサイズを返します。これは、ベクトルオブジェクトによって管理されているメモリのサイズとは無関係です。 –

+0

@KerrekSBありがとう、私は間違った方法でそれを置く。 – unwind

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

1

ラッパー良くありません。 std :: vectorには仮想デストラクタがないので、メモリリークの扉が開きます。 MyVectorの建設は、それへの呼び出しなしだ

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

はデストラクタです:

は、いくつかのメモリリークが発生してみましょう。

は狂気に行こう:

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の質問には答えません。プライベート継承やplain-vanillaカプセル化を使用して、std :: vectorをラップすることができます。 – U007D

関連する問題