【问题标题】:C++ find keys and values in a multimapC++ 在多重映射中查找键和值
【发布时间】:2012-01-08 17:01:43
【问题描述】:

我想创建一个包含不同字符串的结构,并为每个字符串分配一些(不是唯一的)int 值。填充完该结构后,我想检查每个字符串有多少个不同的 int 已分配给它们,它们到底是什么。我知道可以使用多图来解决这个问题。但是我不确定是否(或如何)可以获得包含在多重映射中的所有不同字符串,因为函数“find”需要一个参数进行匹配,而我不知道何时搜索哪些不同的值可能在多图。多图如何做到这一点?

作为替代解决方案,我尝试使用带有向量作为值的简单地图。但是我仍然无法完成这项工作,因为似乎无法识别向量的迭代器,它表明我:迭代器必须有一个指向类类型的指针。

map<string, vector<int>>::iterator multit;
int candID1, candID2, candID3;

for(multit=Freq.begin(); multit!=Freq.end(); multit++)
{
    if((*multit).second.size()==3)
    {
        vector<int> vectorWithIds = (*multit).second;

        for(vector<int>::iterator it = vectorWithIds.begin();
            it != vectorWithIds.end();it++)
        {
            candID1 = it->        Problem: The iterator is not recognized
        }
    }

}

谁能发现问题?是否有可行的解决方案,无论是第一种方式还是第二种方式?

【问题讨论】:

  • 你不应该在for循环中使用*it而不是it-&gt;吗?
  • 您的示例设计非常糟糕,请尝试使用带有仿函数的 for_each 之类的 stl

标签: c++ vector map iterator


【解决方案1】:

好的,这完全没有效率,但你可以使用 std::set 初始化你的 std::vector 来只提取 std::vector 的唯一值,就像在这个例子中一样:

#include <iostream>

#include <vector>
#include <map>
#include <set>

int main() {
    // some data
    std::string keys[] = {"first", "second", "third"};
    int values[] = {1, 2, 1, 3, 4, 2, 2, 4, 9};

    // initial data structures
    std::vector<std::string> words(keys, keys + sizeof(keys) / sizeof(std::string));
    std::vector<int> numbers(values, values + sizeof(values) / sizeof(int));

    // THE map
    std::map< std::string, std::vector<int> > dict;

    // inserting data into the map
    std::vector<std::string>::iterator itr;
    for(itr = words.begin(); itr != words.end(); itr++) {
        dict.insert(std::pair< std::string, std::vector<int> > (*itr, numbers));
    } // for

    // SOLUTION
    // count unique values for the key of std::map<std::string, std::vector<int> >
    std::map<std::string, std::vector<int> >::iterator mtr;
    for(mtr = dict.begin(); mtr != dict.end(); mtr++) {
        std::set<int> unique((*mtr).second.begin(), (*mtr).second.end());
        std::cout << unique.size() << std::endl;
    } // for

    return 0;
} // main

【讨论】:

    【解决方案2】:

    我建议multimap&lt;string, int&gt;。假设我正确理解了您的要求,您拥有“唯一”字符串和几个不同的值。您可以使用count(key) 来查看一个键有多少个值,equal_range(key) 返回一个pair&lt;interator, iterator&gt;,第一个迭代器指向键值范围的开始,第二个迭代器指向值键。

    见reference

    【讨论】:

      【解决方案3】:

      it-&gt; 是什么?如果ints 是向量,你可能想要*it。

      附:我不得不承认我没有读完整篇文章。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-19
        • 1970-01-01
        • 2019-07-23
        • 2021-10-17
        • 1970-01-01
        • 2011-04-14
        相关资源
        最近更新 更多