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));