Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在std::map中放置对象?_C++_Object_Map - Fatal编程技术网

C++ 如何在std::map中放置对象?

C++ 如何在std::map中放置对象?,c++,object,map,C++,Object,Map,试图找出如何在地图中放置对象,其中作者是关键,但似乎找不到如何放置 这是我的类对象和构造函数 class Book { public: string title = ""; string author = ""; int ISBN = 0; Book(string t, string a, int num) { title = t; author = a; ISBN = num; if (ISBN < 1000 || ISBN > 9999

试图找出如何在地图中放置对象,其中作者是关键,但似乎找不到如何放置

这是我的类对象和构造函数

class Book
{ 
public:
string title = "";
string author = "";
int ISBN = 0;

Book(string t, string a, int num) 
{ 
    title = t; 
    author = a; 
    ISBN = num;
    if (ISBN < 1000 || ISBN > 9999)
        throw ("Invalid ISBN");
    assert(ISBN > 1000 || ISBN < 9999);
}
};
教材
{ 
公众:
字符串标题=”;
字符串author=“”;
int-ISBN=0;
书本(字符串t、字符串a、整数)
{ 
title=t;
作者=a;
ISBN=num;
如果(ISBN<1000 | | ISBN>9999)
抛出(“无效ISBN”);
断言(ISBN>1000 | | ISBN<9999);
}
};
这是向量和地图

    vector <Book> books;
try
{
    Book book1("a", "Jim John", 1001);
    books.push_back(book1);
    Book book2("b", "Jim John", 1002);
    books.push_back(book2);
    Book book3("c", "Billy Bill", 1003);
    books.push_back(book3);
    Book book4("d", "Greg Lumburge", 1004);
    books.push_back(book4);
    Book book5("e", "Dallas Orange", 1005);
    books.push_back(book5);
    Book book6("f", "Old McDonald", 1006);
    books.push_back(book6);
}
catch (char*e)
{ 
    cout << "invalid ISBN" << endl; 
    return(EXIT_FAILURE);
}

    map<string, Book> authorMap;

for (auto x : authorMap)
    cout << x.first<< " : "<< x.second << endl;
矢量书;
尝试
{
第1册(“a”,“吉姆·约翰”,1001);
书籍。推回(书籍1);
第二册(“b”,“吉姆·约翰”,1002);
书。推回(书2);
第三册(“c”,“比利比尔”,1003);
书。推回(书3);
第四册(“d”,“格雷格·伦布斯库”,1004);
书。推回(书4);
第5册(“e”,“达拉斯橙”,1005);
书。推回(书5);
第6册(“f”,“老麦当劳”,1006);
书。推回(书6);
}
捕获(字符*e)
{ 

cout请参阅地图文档:

对于您的用例,您可以执行以下操作:

std::map<string,Book> authorMap;
Book book("a", "Jim John", 1001);
authorMap.insert ( std::pair<string,Book>(book.author,Book) );
std::map authorMap;
书籍(“a”,“吉姆·约翰”,1001);
authorMap.insert(std::pair(book.author,book));

因此,您希望从向量填充地图。您可以通过

for_each(books.begin(), books.end(), [&authorMap] (Book & b) { authorMap[b.author]=b; } );
不过,别忘了“包括

如果您是lambdas新手(或未使用C++11),这与

for(vector<Book>::const_iterator it = books.begin(); it!=books.end(); ++it)
{
    authorMap[it->author] = *it;
}
for(vector::const_iterator it=books.begin();it!=books.end();++it)
{
authorMap[it->author]=*it;
}

我还应该指出,如果一位作者写了不止一本书,您的解决方案就会有问题。

地图是一组对的集合。因此,为了在地图中插入某些内容,必须首先将其制作成一对。请参见以下示例:

std::map<char, int> charIntMap;
std::pair<char, int> charIntPair('a', 65);

charIntMap.insert(charIntMap.end(), charIntPair);
charIntMap.insert(charIntMap.end(), std::pair<char, int>('b', 66));

您可以尝试像这样插入API

authorMap.insert ( "Dallas Orange",book5);

authorMap.insert ( "Jim John", Book ("a", "Jim John", 1001));

你可以使用迭代器来使用作者访问书本对象,反之亦然。

那么,你的代码有什么问题?直到我尝试用我的向量填充它,才开始说它不能匹配[]如果我尝试((书B:书){++AudiMAP[B];})键必须是唯一的(C.F. Jim John)。否则,考虑STD::MultIMAP。运算符将键类型作为参数(本例中为字符串类型,而不是书本)。请查看多重映射和无序映射容器,以了解哪个容器最适合您的设计要求。这两个容器都允许具有具有不同值元素的重复键。映射不允许这样做。参考页:和-1:仅链接没有支持说明的答案没有多大帮助,应作为注释发布,或t大多数。我尝试过类似的方法,只是记不清它到底是什么样子。我在插入
对时没有运算符重载错误
无法进入
映射
你到底尝试了什么?你能更新你的问题以反映你已经尝试了什么吗?我写下这个答案时假设你甚至没有尝试插入任何东西。F还是第一个或第二个片段?
authorMap.insert ( "Dallas Orange",book5);

authorMap.insert ( "Jim John", Book ("a", "Jim John", 1001));