2012-02-12 100 views
1

我有一個映射,其值爲std :: pair。無法設置std :: pair std :: map的迭代器

編譯器抱怨試圖建立一個迭代時,按如下,但我不明白爲什麼:

src/DBConnector.cpp: In member function ‘int DBConnector::createGenericInsert(std::string, std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >, std::string&)’: src/DBConnector.cpp:354: error: no match for ‘operator=’ in ‘l_oIterEnd = p_mapValues.std::map<_Key, _Tp, _Compare, _Alloc>::end with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::pair<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >’ /usr/include/c++/4.4/bits/stl_map.h:251: note: candidates are: std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compare, _Alloc>::operator=(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::pair<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >]

我的功能是是:

int DBConnector::createGenericInsert (std::string p_sTable , std::map<std::string , std::pair<int,std::string> > p_mapValues , std::string & po_sInsert) { 

    std::map<std::string,std::pair<int,std::string> > l_oIter; 
    std::map<std::string,std::pair<int,std::string> > l_oIterEnd; 

    std::string s_Fieldnames; 

    l_oIterEnd = p_mapValues.end(); // This is line 354 
    l_oIter = p_mapValues.begin(); 

    s_Fieldnames += l_oIter.first(); 

    ... 
} 

這裏有什麼問題嗎?地圖是否可以包含std :: pairs? (此外,地圖是否可以包含不同類型的按鍵?)

+1

你聲明'l_oIter'爲'std :: map',而不是一個迭代器... – Mat 2012-02-12 17:27:31

回答

4

您沒有正確命名類型iterator

,保存自己的麻煩和使用typedef

typedef std::map<std::string, std::pair<int, std::string>> map_type; 

int DBConnector::createGenericInsert (std::string p_sTable, map_type p_mapValues, 
             std::string & po_sInsert) 
{ 
    std::string s_Fieldnames; 

    map_type::iterator l_oIterEnd = p_mapValues.end(); 
    map_type::iterator l_oIter = p_mapValues.begin(); 

    s_Fieldnames += l_oIter->first; // !! 

    // ... 
} 

請注意,值類型的map<A, B>實際上是pair<A, B>,而B本身被稱爲「映射類型」 。這很重要,因爲許多操作都是在類型上工作的,因此您需要訪問其中的second部分以獲取映射值。

+1

OP:你還需要取消引用迭代器,例如, 'l_oIter-> first()' – Joe 2012-02-12 17:34:55

+1

@Joe:謝謝,我甚至沒有看到 - 編輯! – 2012-02-12 17:35:41

+1

或者,如果您有C++ 11功能可用,請使用'auto'。 'auto l_oIterEnd = p_mapValues.end();' – 2012-02-12 17:53:44

4

這些不是迭代器。

std::map<std::string,std::pair<int,std::string> > l_oIter; 
std::map<std::string,std::pair<int,std::string> > l_oIterEnd; 

上面的代碼應改爲:

std::map<std::string,std::pair<int,std::string> >::iterator l_oIter; 
    std::map<std::string,std::pair<int,std::string> >::iterator l_oIterEnd;