0

コードに理解できない問題があります。リストのリストを作って二次元連想配列のように使いたい。

このようなもの:

token["window"]["title"] = "Amazing!";
cout << token["window"]["title"]; //Amazing!

2行目はうまくいきます。データはファイルから読み取られます。問題は最初の指示にあります。

これは、 2番目の角括弧をオーバーロードする方法です:

TokenPair Token::operator[](string keyName){
    for( list<TokenPair>::iterator pair=keys.begin(); pair != keys.end();++pair){
        if(pair->key == keyName){
            return *pair;
        }
    }
}

ご覧のとおり、クラス TokenPair のオブジェクトを返します。オブジェクト (フィールド TokenPair::value) から値を適切に取得するには、string() でストリーミングとキャストをオーバーロードします。

TokenPair::operator string() const{
    return value;
}
ostream & operator<< (ostream &stream, const TokenPair &pair){
    return stream << pair.value;
}

そして、価値を得る前に私が言うように、うまくいきます。問題は、属性の演算子のオーバーロードにあります:

TokenPair TokenPair::operator=( const string newValue ){
    value = newValue;
    return *this;
}

このメソッドは値を割り当てますが、それを覚えていません! 例えば:

token["window"]["title"] = "Ok";

メソッド内で TokenPair::operator= variable newValue=="Ok"が発生し、最初の行の後でもが "Ok" に設定されます。しかし、後で行うとき:

cout << token["window"]["title"] ;

TokenPair のフィールドはまだ変更されていません。私は尋ねたい:なぜですか?イテレータはそのオブジェクトのコピーを返すのでしょうか? 知らない。助けてください。

4

2 に答える 2

0

map-of-maps の使用方法の例を次に示します。

#include <map>
#include <string>
#include <iostream>
#include <sstream>

const char inputString[] =
  "President 16 Lincoln "
  "President 1 Washington "
  "State Best Illinois "
  "State Biggest Alaska ";
int main () {
  std::map<std::string, std::map<std::string, std::string> > token;
  std::string primary, secondary, result;
  std::istringstream input(inputString);
  while( input >> primary >> secondary >> result )
    token[primary][secondary] = result;
  std::cout << "Abe " << token["President"]["16"] << "\n";
  std::cout << "Springfield, " << token["State"]["Best"] << "\n";
  std::cout << "Blank: " << token["President"]["43"] << "\n";
}
于 2011-10-31T21:03:39.583 に答える