3

次のように宣言されたマップがあります。

map < string, set<string> > index;
std::map < string, set<string> >::iterator iter;

の内容を印刷したいと思いますindex。したがって、次のように書きました。

for (iter = index.begin(); iter!= index.end(); iter++){
    cout << iter->first << endl;}  // It's OK.

しかし、印刷しようとすると、上記のコードは機能しませんiter->second

for (iter = index.begin(); iter!= index.end(); iter++){
    cout << iter-> second << endl;}  // Doesn't work.

これは、secondinindexが文字列のセットであり、単純な文字列ではないためだと思います。しかし、どうすれば印刷できますか?

4

4 に答える 4

4

印刷したい場合

iter->second

演算子 << を使用すると、この演算子をオーバーライドする必要があります! それ以外の場合は、set イテレータを使用して、iter->second によって rappresented の文字列のセットを反復します。

set<string>::iterator iterator_;

更新 [イテレータ]

繰り返しは簡単です、忍者ソリューションは演算子をオーバーロードしています! :P

反復:

map<string, set<string> >::iterator iter_;
for (iter_ = index_.begin(); iter_ != index_.end(); iter_++) {
cout << iter_->first << " - ";
    set<string>::iterator iterator_;
for (iterator_ = s.begin(); iterator_ != s.end(); iterator_++) {
    cout << *iterator_ << " - ";
}   
    cout << endl;
}

update [ostream& opeartorのオーバーロード<<]

class MySet: public set<string> {
friend ostream& operator<<(ostream& out, const MySet& s) {
    set<string>::iterator iterator_;
    for (iterator_ = s.begin(); iterator_ != s.end(); iterator_++) {
        out << *iterator_;
    }
    return out;
}

void test() {
    map<string, MySet> index_;
    map<string, MySet>::iterator iter_;
    for (iter_ = index_.begin(); iter_ != index_.end(); iter_++) {
        cout << iter_->first << " - ";
        cout << iter_->second;  
    }
}
};
于 2012-12-04T13:27:26.677 に答える
1

私はここ数年、次の機能を使用しています。operator<< をオーバーロードする場合は注意が必要です。標準の operator<< とカスタマイズした operator<< のどちらかを選択できないため、コンパイラでエラーが発生する可能性があるためです。

ラムダと範囲ベースの for ループが導入された C++11 では、おそらくそれほど必要ではなくなるでしょう。

#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;

template<typename C>
void print_container(ostream& os, const C& c)
{
  copy(c.begin(), c.end(), ostream_iterator<int>(os, " "));
}

int main(void)
{
  vector<int> v; 
  v.push_back(1); 
  v.push_back(2);
  v.push_back(3);

  print_container(v);
}
于 2012-12-04T16:26:50.093 に答える
0

出力演算子が標準ライブラリ型に対して定義されていないことは、(私の意見では) C++ で最も厄介なことの 1 つです。

次のようなコードが必要です。

typedef std::map < string, set<string> >::iterator iter;

for (iter = index.begin(); iter!= index.end(); iter++) {
  std::cout << iter->first << " : {";
  for(set<string>::iterator it = iter->second.begin(); it != iter->second.end(); ++it) {
    std::cout << *it << " ";
  }
  std::cout << "}\n";
}
于 2012-12-04T13:44:27.803 に答える