2011-08-12 4 views
0

を読んで構築しようとしたときに、私は次のエラーを取得しています:「無効な初期化」エラーマップから

error: invalid initialization of non-const reference of type "std::vector<......" 

コード:

class Config { 
    public: 
     std::vector<string>& GetValuesForList(std::string listName); 

    private: 
     std::map<std::string, std::vector<string> > lists; 
    }; 

    inline std::vector<string>& 
    Config::GetValuesForList(std::string listName) { 
     return lists.find(listName); 
    } 

を、私はそれをよく読んでと思わましたC++の一時的なものだからですが、それを解決する方法がわかりません。どんな助けでも大歓迎です。

ありがとうございました。

答えて

2

map::findはイテレータを返します。だから、それはだ第2の値を使用する必要があります。

inline std::vector<string>& 
    Config::GetValuesForList(std::string listName) { 
     return lists.find(listName)->second; 
    } 
+0

ありがとう、それは完全に働いた。 – MeanwhileInHell

2

return lists.find(listName)->second;をお聞きしますか?

[サイドノート:listsvectormapあるもののために非常に良い名前ではありません!]

+0

おかげでたくさんの全体を簡素化することができ、注意点としては

inline std::vector<string>& Config::GetValuesForList(std::string listName) { std::map<std::string, std::vector<string> >::iterator itr = lists.find(listName); if (itr != lists.end()) { return itr->second;; } else { // What to do if not found. } } 

を下回っていること完璧に働いた。 – MeanwhileInHell

0

pair<key,value>にイテレータを返すmap::find()

私は、その優れたこの書くことだと思う:

std::vector<string>& Config::GetValuesForList(std::string listName) 
{ 
    return lists[listName]; 
} 

をキーlistNameがマップに存在する場合、それが関連付けられた値を返します。それ以外の場合は、マップに新しいエントリが作成され、新しく作成されたstd::vector<T>が空になります。

私はまた、鍵が見つからない場合は、新しいエントリを作成しないように、あなたは上記の関数を呼び出す前に、検査に使用することができたbool DoesExist(std::string listName)として別の関数を追加するように提案したい:

bool DoesExist(std::string listName) 
{ 
    return lists.find(listName) != lists.end(); 
} 

また、listsという名前をvecMapに変更した方が良いでしょう。

+0

キーが見つからない場合、これは要素を作成します。 –

+0

@Oli:はい。私はこの情報を私の答えに加えていた。 – Nawaz

0

std::map<T>::find()が値型に参照しない、std::map<T>::iteratorを返します。何が欲しいのは、あなたはそれが新しい空のベクトルを作成する場合は見つからなかった場合は、その後、あなたは

inline std::vector<string>& 
    Config::GetValuesForList(std::string listName) { 
     return lists[listName]; // Creates a new vector if listname not found 
    } 
関連する問題