gpt4 book ai didi

c++ - 一次打印多个相等键的值 C++

转载 作者:行者123 更新时间:2023-11-30 05:25:49 25 4
gpt4 key购买 nike

早上好我有一个以这种方式定义的多重映射

multimap<string, string> H_test;

具有从用户插入的值(同一作者以随机顺序编写的多本书)

H_test.insert(pair<string, string>(author, book));

我想要这样的输出:

Author I // one author
Book A // all book written by this author
Book B
Author II
Book K
Author III
Book C
Book D
Book E

使用这段代码

for (multimap<string,string>::iterator it = H_test.begin(); it != H_test.end(); it++)
{
//if ()
{
pair <multimap<string, string>::iterator, multimap<string, string>::iterator> ret;
ret = H_test.equal_range(it->first);
std::cout << it->first << endl;
for (multimap<string, string>::iterator sd = ret.first; sd != ret.second; sd++)
{
cout << "\t" << sd->second << endl;
}
}
}

我得到这个输出

Author I
Book A
Book B
Author I
Book A
Book B
Author II
Book K
Author III
..

在我看来,它会打印第一个键的名称(以及所有具有相同作者的书籍),然后转到第二个名称(具有相同名称),然后重写所有内容。你知道怎么解决吗?

谢谢

最佳答案

upper_bound 是你的 friend 。你想像这样使用它:

auto start = begin(H_test);

while (start != end(H_test)) {
auto finish = H_test.upper_bound(start->first);

cout << "Author: " << start->first << endl;
for_each(start, finish, [](const auto& i) { cout << "Book: " << i.second << endl; });
start = finish;
}

Live Example

注意:您可以使用cbegincend而不是如果 H_testconst .

编辑:

它帮助我概念化 multimap作为 pair 的排序数组s,其中 pair 中的第一个元素是键,第二个元素是值。这实际上是我们要做的:

  1. 遍历所有 pair使用start作为我们的迭代器,从第一个 pair 开始: auto start = begin(H_test)并转到最后pairmultimap : while(start != end(H_test))
  2. 接下来我们要找到pair的范围s 在共享相同 key 的容器中,为此我们将使用 upper_bound 找到一个指向末尾的迭代器。我链接上面详细信息的功能:auto finish = H_test.upper_bound(start->first)
  3. 我们将打印我们刚刚在范围内找到的当前作者的书籍:cout << "Author: " << start->first << endl
  4. 然后我们将打印 start 定义范围内的每本书至 finish使用 for_each 和一个 lambda 仅打印该对的值,然后移至下一行:for_each(start, finish, [](const auto& i) { cout << "Book: " << i.second << endl; });
  5. 最后我们将设置start到下一个范围的开头,下一次将通过循环打印:start = finish

关于c++ - 一次打印多个相等键的值 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38084808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com