0

マップを作成します:

map<string, string> cuts;

cuts["cutb"] = "a>1";
cuts["cuta"] = "b>3";
cuts["cutc"] = "c<5";

このマップを繰り返し処理するとmap<string, string>::iterator itr = cuts.begin();、cuta、cutb、cutc などのアルファベット順に並べられます。

Cutb、cuta、cutc などの要素を定義した順序に従うようにイテレータを強制するにはどうすればよいですか?

4

3 に答える 3

3

データ構造の他の実装を使用する必要があります。赤黒ツリーの実装は、あなたの場合には役に立ちません。

より一般的な観点から見ると、エントリを追加順にトラバースする場合、なぜマップを作成する必要があるのでしょうか? ペアのリスト/配列/ベクトルで十分ではありませんか?

編集: ヒント: 特定のデータ構造を使用することを選択するときはいつでも、サポートする必要がある操作を正確に自問してください。それに答えた後、あなたはより正確に選択できるはずです。キーで検索し、キーで挿入し、特定のキーが存在するかどうかを確認する必要がある場合は、マップが適しています。ただし、これらの操作を最適化する実装で支払う代償は、通常、要素の挿入順序を失うことです。

EDIT2 : ペアのリストをループ:

// pair is class in namespace std
vector<pair<string, string> > v;
v.push_back(make_pair("cutb", "a>1"));
v.push_back(make_pair("cuta", "b>3"));
v.push_back(make_pair("cutc", "c<5"));
for (int i = 0; i < v.size(); i++) {
  // the first element of the pair is addressed with .first; the second - .second
  cout << "For key " << v[i].first << " the value is "  << v[i].second << endl;
}

ベクトルでの反復は反復子を使用して実行することもできますが、最適でありながら理解しやすいので、私はインデックス アプローチの方が好きです。

于 2012-12-09T17:34:25.283 に答える
2

わかりました。これはもう少し読みやすくなります。

typedef std::pair<std::string, std::string> item;
std::vector<item> vec; 
vec.push_back(item("hello", "world"));
vec.push_back(item("abc", "efg"));

for (size_t i = 0; i < vec.size(); ++i) {
    std::cout << vec.at(i).first << " " << vec.at(i).second << std::endl;
}
于 2012-12-09T17:50:31.827 に答える
2

You can't (or if you can, you shouldn't). If you need to retain order, you need another data structure. Try STL's vector

http://www.cplusplus.com/reference/vector/vector/

于 2012-12-09T17:35:06.173 に答える