[英]C++ STL map , std::pair as the key
這就是我通過map定義的方式。
std::map<std::pair<std::string,std::string>, int> edMap;
我對如何插入值感到困惑,我總是遇到編譯錯誤。 這就是我試圖插入的方式。
std::pair<std::string,std::string> key;
edMap.insert(key,d);
編譯錯誤是
1>------ Build started: Project: spellsuggest, Configuration: Debug Win32 ------
1>Compiling...
1>breathalyzer.cpp
1>d:\personal\spellsuggest\spellsuggest\breathalyzer.cpp(70) : error C2664: 'std::_Tree<_Traits>::iterator std::_Tree<_Traits>::insert(std::_Tree<_Traits>::iterator,const std::pair<_Ty1,_Ty2> &)' : cannot convert parameter 1 from 'std::pair<_Ty1,_Ty2>' to 'std::_Tree<_Traits>::iterator'
1> with
1> [
1> _Traits=std::_Tmap_traits<std::pair<std::string,std::string>,int,std::less<std::pair<std::string,std::string>>,std::allocator<std::pair<const std::pair<std::string,std::string>,int>>,false>,
1> _Ty1=const std::pair<std::string,std::string>,
1> _Ty2=int
1> ]
1> and
1> [
1> _Ty1=std::string,
1> _Ty2=std::string
1> ]
1> and
1> [
1> _Traits=std::_Tmap_traits<std::pair<std::string,std::string>,int,std::less<std::pair<std::string,std::string>>,std::allocator<std::pair<const std::pair<std::string,std::string>,int>>,false>
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>Build log was saved at "file://d:\personal\spellsuggest\spellsuggest\Debug\BuildLog.htm"
1>spellsuggest - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我們試試吧:
typedef std::pair<std::string, std::string> my_key_type;
typedef std::map<my_key_type, int> my_map_type;
my_map_type m;
m.insert(my_map_type::value_type(my_key_type("A", "B"), 43));
注意到map的value_type
總是std::pair<const key_type, mapped_type>
,所以在你的情況下它是std::pair<my_key_type, int>
- 一對第一個成員本身就是一對!
考慮到這一點,您也可以使用make_pair
:
m.insert(std::make_pair(my_key_type("C", "D"), -5));
最后,正如Sven指出的那樣,對可能有也可能沒有比較運算符(我認為有); 所以,如果沒有,你必須自己寫一個。 應該對這兩個要素進行字典比較。 索菲等待着:-)
(這是詞典對比較; 你不需要寫這個,它已經存在了 :)
template<typename S, typename T>
bool operator<(const std::pair<S, T> & a, const std::pair<S, T> & b)
{
return (a.first < b.first) || (a.first == b.first && a.second < b.second);
}
insert方法需要一對完整的map類型,所以你必須這樣做:
edMap.insert(make_pair(key, d));
請注意:
std::pair<std::string,std::string> key;
edMap.insert(make_pair(key,d));
如果已存在具有相同值的鍵,則將無法插入任何內容。
另一方面,這個:
std::pair<std::string,std::string> key;
edMap[key] = d;
將在地圖中創建新項目,或覆蓋以前的值(如果存在)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.