【问题标题】:Skip same multimap values when iterating迭代时跳过相同的多图值
【发布时间】:2011-10-17 10:52:01
【问题描述】:

有没有什么好的方法可以在下面实现所需的输出,而不必删除相同的值或创建另一个列表/向量等?我正在尝试将在不同文档中找到的单词映射到它们的文档名称,如所需输出中所示。

#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <sstream>

using namespace std;

multimap<string,string> inverts;
multimap<string,string>::iterator mit;
multimap<string,string>::iterator rit;
pair<multimap<string,string>::iterator,multimap<string,string>::iterator> ret;

int main(int argc, char* argv[])
{
ifstream infile;

for(int i=1;i<argc;i++)
{
    char* fname=argv[i];
    char line[1024];
    string buff;
    infile.open(fname);

    while(infile.getline(line,1024))
    {
        stringstream ss(line);
        while(ss >> buff)
            inverts.insert(pair<string,string>(buff,fname));
    }

    infile.close();

}

for(mit=inverts.begin();mit!=inverts.end();mit++)
{
    string first=(*mit).first;
    cout<<first;
    ret=inverts.equal_range(first);

    for(rit=ret.first;rit!=ret.second;rit++)
        cout<<" "<<(*rit).second;
    cout<<endl;

}


return 0;

}

Output is:

> ./a.out A B
cat A
dog A B
dog A B
fox A B
fox A B
lion B

I need this output:

> ./a.out A B
cat A
dog A B
fox A B
lion B

【问题讨论】:

标签: c++ multimap


【解决方案1】:

您可以将inverts 更改为map&lt;string,set&lt;string&gt;&gt;,将每个单词映射到它出现的文件名集。

【讨论】:

    【解决方案2】:

    一个典型的多图迭代有两个迭代器:

    for (it1 = inverts.begin(), it2 = it1, end = inverts.end(); it1 != end; it1 = it2)
    {
       // iterate over distinct values
    
       // Do your once-per-unique-value thing here
    
       for ( ; it2 != end && *it2 == *it1; ++it2)
       {
         // iterate over the subrange of equal valies
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 2017-08-03
      • 2019-05-06
      • 2020-11-11
      相关资源
      最近更新 更多