2

私は次のように定義されたマップを持っています:

map < char, vector < unsigned char>> dict;

関数がコンテンツを生成してこのディクショナリに追加した後、次にループ内の各キーと値のペアを反復処理して出力したいと考えています。

for(auto it = dict.begin(); it != dict.end(); ++it)
{
    cout << it.first << " : ";
    // how to output the vector here? since the len of value differs
    // for each key I need that size
    for( unsigned int s = it.size()
}

ベクトルを反復処理して出力できるように、イテレータから値のサイズを取得するにはどうすればよいですか。

4

4 に答える 4

3

この質問は少し古いことは知っていますが、同様の質問があり、この投稿が役に立ったので、ここに解決策を投稿できると思います. ここにある例に基づいて: map と multimap 私はもちろん、複数の値を含むmapペア<string, vector<string> >を持っていますvector<string>

#include <string.h>
#include <iostream>
#include <map>
#include <utility>
#include <vector>

using namespace std;

int main() {
   map< string, vector<string> > Employees;
   vector <string> myVec;
   string val1, val2, val3;
   val1 = "valor1";
   val2 = "valor2";
   val3 = "valor3";

   // Examples of assigning Map container contents
   // 1) Assignment using array index notation
   Employees["Mike C."] = {"val1","val2", "val3"};
   Employees["Charlie M."] = {"val1","val2", "val3"};

   // 2) Assignment using member function insert() and STL pair
   Employees.insert(std::pair<string,vector<string> >("David D.",{val1,val2,val3}));

   // 3) Assignment using member function insert() and "value_type()"
   Employees.insert(map<string,vector<string> >::value_type("John A.",{"val7","val8", "val9"}));

   // 4) Assignment using member function insert() and "make_pair()"
   myVec.push_back("val4");
   myVec.push_back(val1);
   myVec.push_back("val6");
   Employees.insert(std::make_pair("Peter Q.",myVec));

   cout << "Map size: " << Employees.size() << endl;

   for(map<string, vector<string> >::iterator ii=Employees.begin(); ii!=Employees.end(); ++ii){
       cout << (*ii).first << ": ";
       vector <string> inVect = (*ii).second;
       for (unsigned j=0; j<inVect.size(); j++){
           cout << inVect[j] << " ";
       }
       cout << endl;
   }
}

情報を追加するさまざまな方法と、ベクトルがいくつかの値を持つ「キーベクトル」のペアを出力する出力部分に気付くかもしれません。C++11 の場合、次のように出力することもできます。

for(auto ii=Employees.begin(); ii!=Employees.end(); ++ii){
   cout << (*ii).first << ": ";
   vector <string> inVect = (*ii).second;
   for (unsigned j=0; j<inVect.size(); j++){
       cout << inVect[j] << " ";
   }
   cout << endl;
}

出力は次のようになります。

Map size: 5
Charlie M.: val1 val2 val3 
David D.: valor1 aVal1 valor3 
John A.: val7 val8 val9 
Mike C.: val1 val2 val3 
Peter Q.: val4 valor1 val6 

PS: 出力の順序が異なる理由はわかりません。異なるプッシュ方法とその速度が関係していると思います。

于 2015-04-20T23:33:42.070 に答える
2

it.second指定されたマップ要素のベクトルのコピーを提供するため、内部ループを次のように変更できます

for(auto it2 = it->second.begin(); it2 != it->second.end(); ++it2)
    cout << *it2 << " ";
于 2013-08-21T16:35:12.943 に答える
0

まだこれを探している人にとっては、これは機能します ここに画像の説明を入力

于 2021-04-09T03:27:40.817 に答える