无法设置std :: pair的std :: map的迭代器

时间:2012-02-12 17:23:57

标签: c++ map iterator std-pair

我有一张地图,其值为std :: pair。

在尝试设置迭代器时,编译器会抱怨如下,但我无法理解原因:

  

src / DBConnector.cpp:在成员函数'int中   DBConnector :: createGenericInsert(的std :: string,   std :: map< std :: basic_string< char,std :: char_traits< char>,   的std ::分配器<炭> >,std :: pair< int,std :: basic_string< char,   std :: char_traits< char&gt ;,std :: allocator< char> > >中   std :: less< std :: basic_string< char,std :: char_traits< char>,   的std ::分配器<炭> > >,std :: allocator< std :: pair< const   std :: basic_string< char,std :: char_traits< char&gt ;,std :: allocator< char>   >,std :: pair< int,std :: basic_string< char,std :: char_traits< char&gt ;,std :: allocator< char> > > > > >,std :: string&)':   src / DBConnector.cpp:354:错误:不匹配'operator ='in   'l_oIterEnd = p_mapValues.std :: map< _Key,_Tp,_Compare,_ Alloc> :: end   with _Key = std :: basic_string< char,std :: char_traits< char>,   的std ::分配器<炭> >,_ Tp = std :: pair< int,std :: basic_string< char,   std :: char_traits< char&gt ;,std :: allocator< char> > >,_比较=   std :: less< std :: basic_string< char,std :: char_traits< char>,   的std ::分配器<炭> > >,_ Alloc = std :: allocator< std :: pair< const   std :: basic_string< char,std :: char_traits< char&gt ;,std :: allocator< char>   >,std :: pair< int,std :: basic_string< char,std :: char_traits< char&gt ;,std :: allocator< char> > > > >”   /usr/include/c++/4.4/bits/stl_map.h:251:注意:候选人是:   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&gt ;,std :: allocator< char> >,_ Tp = std :: pair< int,std :: basic_string< char,   std :: char_traits< char&gt ;,std :: allocator< char> > >,_比较=   std :: less< std :: basic_string< char,std :: char_traits< char>,   的std ::分配器<炭> > >,_ Alloc = std :: allocator< std :: pair< const   std :: basic_string< char,std :: char_traits< char&gt ;,std :: allocator< char>   >,std :: pair< int,std :: basic_string< char,std :: char_traits< char&gt ;,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吗? (此外,地图可以包含持有不同类型的键吗?)

2 个答案:

答案 0 :(得分:5)

您没有正确命名类型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本身被称为“映射类型”。这很重要,因为许多操作都在 value 类型上工作,因此您需要访问它的second部分才能获得映射值。

答案 1 :(得分: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;
相关问题