2016-11-11 1 views
1

4つの静的ベクトルがあります。私の.cppファイル(!ない私の.hファイル)で、私は、次のようなこれらのベクトルを定義します。マップに格納されているベクトルに格納されている要素の数を計算する方法

 std::vector<Object*> ClassA::vecA; 
    std::vector<Object*> ClassA::vecB; 
    std::vector<Object*> ClassA::vecC; 
    std::vector<Object*> ClassA::vecD; 

それから私は、Object型のオブジェクトの数と、これらのベクトルのそれぞれを取り込みます。

次の私は、マップを作成します。

 std::map<std::string, std::vector<Object*> > cntr; 

私は上からのベクトルと各ベクトルのキーとして文字列を使用して、このマップを読み込みます。

問題は、マップ内のベクトルにアクセスして、その要素の数を調べる方法です。私は試しました:

 for (it = Cntr.begin(); it != Cntr.end(); it++) 
    { 
     if (it->first != token) 
     { 
     std::cout << it->first << std::endl; 

      int i = (it->second).size(); 

      std::cout << "SIZE: "  << i << std::endl; 

     } 
    } 

私はいつも私に1の値を与えます。正しいアプローチは何ですか?

+0

をコードは 'ループ内Cntr'は'代わりにcntr'しなければならない、と '私はint型ことを除いて(正常に見えます'は' size_t i'または 'std :: vector :: size_type'でなくてはなりません)。しかし、どのような場合でも、ベクターや地図をどのように埋め込んでいるかはわかりませんでした。しかし、 'size()'は嘘ではありません。 1を返すと、実際にはベクトルには1つの要素しかありません。 –

答えて

2

まず、イテレータをマップの有効な要素を指すように設定する必要があります。あなたがするとき

std::map<std::string, std::vector<Object*>>::iterator Class::it; 
int size = it->second.size(); 

it何も指さないので、それは未定義の動作です。あなたができることは何ですか?

std::map<std::string, std::vector<Object*>>::iterator Class::it; 
it = cntr.begin(); 
int size = it->second.size(); 

これでマップの最初のベクトルのサイズが得られます。

すべてのサイズを取得したい場合は、地図を反復処理する必要があります。素敵なrangedベースのforループのようにこれを行うことができます

for (const auto & elem : cntr) // get a const reference to each pair 
    std::cout << elem.second.size(); 
+0

これはループforループで行われていることに言及する必要があります: – MagnusHimmler

+0

@MagnusHimmler次に、あなたの質問に[mcve]を提供する必要があります。 – NathanOliver

0

NathanOliverの回答は、C++ 11の場合に有効です。そうでない場合は、コードを明確にするのtypedefで、これを試すことができます。

typedef std::vector<Object*> MypObjVec; 
typedef std::map<std::string, MypObjVec> MyMap; 

MyMap::iterator Class::it = cntr.begin(); 
const MyMap::iterator Class::it_end = cntr.end(); 

for(; it!=it_end ; ++it) 
{ 
    std::cout<< it->second.size() << std::endl; 
} 
関連する問題