迭代时跳过相同的多重映射值

发布于 2024-12-10 17:31:38 字数 1304 浏览 0 评论 0 原文

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

#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

Is there any good way to achieve the desired output below without having to remove the same values or creating another list/vector etc? I am trying to map words found in different documents to their document names as shown in the desired output.

#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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

幻梦 2024-12-17 17:31:38

您可以将 inverts 更改为 map>,将每个单词映射到它出现的文件名集。

You could change inverts into map<string,set<string>>, mapping each word to the set of file names where it appears.

年华零落成诗 2024-12-17 17:31:38

典型的多映射迭代保留两个迭代器:

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
   }
}

A typical multi-map iteration keeps two iterators:

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
   }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文