添加字符串和列表到c++中的映射

adding string and list to map in c++

本文关键字:映射 c++ 字符串 列表 添加      更新时间:2023-10-16

我是c++的新手。我试图在cpp中添加一个dragon对象,但在添加对象时收到错误

#include "dragon.h"
using std::cin;
#include <map>
using std::map;
#include <list>
#include <string>
#include <iostream>
using namespace std;
using std::list;
typedef map<string,list<Dragon> >::iterator iter;
typedef map<const string,list<Dragon> >::value_type dmaptype;
void display(map<string,list<Dragon> > dmap1,iter dmapiter1);

int main( )
{
  map<string,list<Dragon> >dmap;
iter dmapiter;
bool again = true;
string name;
double length;
string colour;
string location;
while( again )
{
     // get the details for the dragon
     cout << "nEnter dragon name >> ";
     getline( cin, name );
     cout << "nEnter dragon length >> ";
     cin >> length;
     cin.get( );
     cout << "nEnter dragon colour >> ";
     getline( cin, colour );
     // now get the location
     cout << "nEnter location >> ";
     getline( cin, location );
     dmapiter=dmap.find(location);
    Dragon * ptr ;
    ptr=new Dragon(name,length,colour);
     if(dmapiter==dmap.end())
     {
        list<Dragon*> dlist;
        dlist.push_back(ptr);
        dmap.insert(dmaptype(location, dlist));
     }
     else
     {
        dmapiter->second.push_back(*ptr);
     }
     char choice;
     cout << "nEnter another dragon and location [ y / n ] ? ";
     cin >> choice;
     cin.get( );
     if( choice != 'y' && choice != 'Y' )
     {
          again = false;
     }
}
 display(dmap,dmapiter);

cout << endl;
return 0;

}

当我编译程序时,我收到一个错误:

dmap.insert(dmaptype(location, dlist));

错误为:

 error: no matching function for call to ‘std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::list<Dragon, std::allocator<Dragon> > >::pair(std::string&, std::list<Dragon*, std::allocator<Dragon*> >&)’
/usr/lib/gcc/i686-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_pair.h:83: note: candidates are: std::pair<_T1, _T2>::pair(const _T1&, const _T2&) [with _T1 = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _T2 = std::list<Dragon, std::allocator<Dragon> >]
/usr/lib/gcc/i686-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_pair.h:79: note:                 std::pair<_T1, _T2>::pair() [with _T1 = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _T2 = std::list<Dragon, std::allocator<Dragon> >]
/usr/lib/gcc/i686-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_pair.h:68: note:                 std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::list<Dragon, std::allocator<Dragon> > >::pair(const std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::list<Dragon, std::allocator<Dragon> > >&)

任何帮助都将不胜感激。。。

感谢

尝试:

dmap.insert(std::make_pair(location, dlist));

但您也需要使数据列表的类型与地图的类型一致——两者都使用list<Dragon>list<Dragon*>

为了简单起见(所以您不必担心删除),请先尝试list<Dragon>。当你插入到这个列表中时,会产生一个副本(因为STL有值语义),所以如果你在堆栈上本地创建一个Dragon来插入到dlist中也是可以的。(你可以把它看作是一个正在制作的副本:如果编译器很聪明,可能会出现副本省略,但现在不要担心)。

例如:

Dragon dragon(name,length,colour);
if(dmapiter==dmap.end())
{
  list<Dragon> dlist;
  dlist.push_back(dragon);
  dmap.insert(make_pair(location, dlist));
}
else
{
  dmapiter->second.push_back(dragon);
}