2011-05-17 50 views
0

我試圖插入與一個std ::設定值的unordered_map宣佈爲:unordered_map插入錯誤C++

class Database { 
... 
private: 
    struct CountryRCID { 
     int RCID; 
     int Vote; 
    }; 
    struct comp { 
     bool operator() (const CountryRCID& left, const CountryRCID& right) const { 
      return left.RCID < right.RCID; 
     } 
    }; 
    std::unordered_map<const char*, std::set<CountryRCID, comp> > CNTVotes; 
}; 

在數據庫構造函數中,我從一個文件中讀取數據,並試圖插入在unordered_map

Database() { 
    char CNT[3]; 
    CountryRCID RCIDVote; 
    ... Insert data into CNT and RCIDVote ... 
    CNTVotes.insert(std::make_pair(CNT, RCIDVote)); 
} 

我試圖編譯具有兩個密碼:

g++ main.cpp -std=gnu++0x 

g++ main.cpp -std=c++0x 

,但我收到的錯誤:

In file included from /usr/include/c++/4.4/bits/stl_algobase.h:66, 
       from /usr/include/c++/4.4/bits/char_traits.h:41, 
       from /usr/include/c++/4.4/ios:41, 
       from /usr/include/c++/4.4/istream:40, 
       from /usr/include/c++/4.4/fstream:40, 
       from db.h:1, 
       from main.cpp:1: 
/usr/include/c++/4.4/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(std::pair<_U1, _U2>&&) [with _U1 = char*, _U2 = Database::CountryRCID, _T1 = const char* const, _T2 = std::set<Database::CountryRCID, Database::comp, std::allocator<Database::CountryRCID> >]’: 
db.h:50: instantiated from here 
/usr/include/c++/4.4/bits/stl_pair.h:107: error: no matching function for call to ‘std::set<Database::CountryRCID, Database::comp, std::allocator<Database::CountryRCID> >::set(Database::CountryRCID)’ 
/usr/include/c++/4.4/bits/stl_set.h:212: note: candidates are: std::set<_Key, _Compare, _Alloc>::set(std::initializer_list<_CharT>, const _Compare&, const _Alloc&) [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>] 
/usr/include/c++/4.4/bits/stl_set.h:199: note:     std::set<_Key, _Compare, _Alloc>::set(std::set<_Key, _Compare, _Alloc>&&) [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>] 
/usr/include/c++/4.4/bits/stl_set.h:188: note:     std::set<_Key, _Compare, _Alloc>::set(const std::set<_Key, _Compare, _Alloc>&) [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>] 
/usr/include/c++/4.4/bits/stl_set.h:145: note:     std::set<_Key, _Compare, _Alloc>::set(const _Compare&, const _Alloc&) [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>] 
/usr/include/c++/4.4/bits/stl_set.h:136: note:     std::set<_Key, _Compare, _Alloc>::set() [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>] 

我也曾嘗試不同的插入方法:

CNTVotes[CNT] = RCIDVote; 

std::pair <const char*, CountryRCID> test (CNT, RCIDVote); 
CNTVotes.insert(test); 

這只是導致類似錯誤

如果有人能幫助我理解它爲什麼不起作用以及我能做些什麼來完成這項工作,我將非常感激。

謝謝。

+1

比較是關鍵,而不是值。另外你插入一個單一的對象而不是一個集合。但即使你解決了這個問題,它會崩潰,因爲你使用char指針作爲鍵的方式被搞砸了。 – 2011-05-17 18:57:32

回答

2

CountryRCID是一種struct,它不是一個std::set ...你首先需要構建一個std::set<CountryRCID>std::set和使用,在您的參數爲makePair(),以匹配您的unordered_map的模板參數。

我也認爲struct comp仿函數是多餘的......只需爲您的CountryRCID結構定義operator<()operator==()即可。

如果你這樣做,並將CNTVotes的聲明更改爲(順便說一下,請注意,我借用尼爾的建議,使用std::string而不是const char*作爲鍵值。我認爲這是一個很好的主意)

std::unordered_map<std::string, std::set<CountryRCID> > CNTVotes; 

那麼你就可以做到以下幾點:

CountryRCID RCIDVote; 
//... Insert data into CNT and RCIDVote ... 
std::string CNTString(CNT); 
std::set<CountryRCID> RCIDVoteSet; // <== make a std::set of type set<CountryRCID> 
RCIDVoteSet.insert(RCIDVote); 
CNTVotes.insert(std::make_pair(CNTString, RCIDVoteSet)); 
+0

完美。非常感謝,這正是我需要做的,我也很感謝comp。的幫助。 – Ryan 2011-05-17 19:02:27

+0

沒問題,很高興它解決了:) – Jason 2011-05-17 19:06:34

1

沒有構造函數可以從進入該集合的類型的單個對象中創建集合。您需要創建一個臨時設置並添加項目,然後使用它添加到unordered_map

編輯:其實,因爲你有一個實際的對象,我認爲你可以逃脫的iterator, iterator構造是這樣的:

CNTVotes.insert(std::make_pair(CNT, std::set(&RCIDVote, &RCIDVote + 1)));

4

可能沒有直接跟你的問題,但焦炭的地圖*從來不真的有用。相反的:

std::unordered_map<const char*, std::set<CountryRCID, comp> > CNTVotes; 

你可能想:

std::unordered_map<std::string, std::set<CountryRCID, comp> > CNTVotes; 
+0

假設有一個適當的散列專用於C字符串,我不明白爲什麼這不起作用(儘管我仍然同意使用'string')。 – 2011-05-17 18:56:00

+1

@地圖所指向的@rs字符是常量,但可能沒有用戶所關心的那樣,所以它們可能會改變它。 unordered_map需要與原始字符串進行比較以避免衝突,所以如果這可以更改,我們在Undefined Behavior land中。底線,地圖鍵應始終是值,除非你非常非常確定你在做什麼。 – 2011-05-17 19:00:44

+0

完全同意尼爾... – Jason 2011-05-17 19:04:07

0

賈森提到的,你在地圖中值是一組而不是單個CountryRCID結構。如果你指的CountryRCID添加到該集合在地圖上你可能想是這樣的:

typedef std::set<CountryRCID, comp> MySet; 
typedef std::unordered_map<const char*, MySet> MyMap; 

MyMap::_Pairib ret = CNTVotes.insert(std::make_pair(CNT, MySet())); 
ret.first->second.insert(RCIDVote);