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

C++ 一次打印多个相等键的值C++;,c++,dictionary,C++,Dictionary,早上好, 我用这种方式定义了一个多重映射 multimap<string, string> H_test; 使用此代码 for (multimap<string,string>::iterator it = H_test.begin(); it != H_test.end(); it++) { //if () { pair <multimap<string, string>::iterat

早上好, 我用这种方式定义了一个多重映射

multimap<string, string> H_test;
使用此代码

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;
            }
        }
    }
在我看来,它打印第一个键的名称(以及所有具有相同作者的书籍),然后转到第二个nome(具有相同名称),然后重写所有内容。 你知道怎么解决吗

谢谢

是你的朋友。您可能希望使用类似这样的方式:

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;
}
自动启动=开始(H_测试);
while(开始!=结束(H_测试)){
自动完成=H_测试。上限(开始->第一);

只需在多重映射中迭代,由于具有同一作者的所有元素都被分组在一起,您只需检测作者的变化,就可以知道您已转到下一个作者,此时您将打印作者的姓名。将
lastAuthor
预设为可能与真实作者不匹配的内容。此示例O(n)中的ecutes

string lastAuthor=“**SENTINEL**”;
用于(常量自动和元素:H_测试)
{
if(lastAuthor!=elem.first)
{

cout First,
it=H_test.begin();it!=Hiwi_test.end()
-您正在比较两个不同容器中的迭代器?A是有保证的。发布一个。为什么不使用
std::map
似乎有点奇怪,除非您有意探索多重映射。抱歉,我在发布之前对代码做了一点更改。应该是它=H_test.begin();它!=H_test.end()@Downvoter我可以得到关于downvote原因的澄清吗?据我所知,这是打印
多贴图的标准程序。谢谢,它可以工作。你能解释一下它是如何工作的吗?我的意思是,你创建了一个变量auto(?)打了一圈后,你设定了开始=结束。我不明白它是什么do@GVa我已经更新了我的示例并进行了解释。如果有任何步骤不清楚,让我们在这里的注释中重新讨论它们。就
auto
而言,您可以将其视为具有一些附带好处的内联模板。在C++11之后,您基本上需要声明所有变量th
auto
,但整个概念太大,无法在注释中定义(此外,即使语言在推动它,也有人对它提出异议)。在任何情况下,关于它的卓越文档都可以在这里找到:
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
..
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;
}
string lastAuthor = "**SENTINEL**";
for (const auto& elem : H_test)
{
  if(lastAuthor != elem.first)
  {
    cout << "Author: " << elem.first << '\n';
    lastAuthor = elem.first;
  }

  cout << "Book: " << elem.second << '\n';
}