创建并迭代使用两个字符串作为键的多图

时间:2012-01-20 02:26:50

标签: c++

我想构建一个多图,这样我就可以有一个与一个键相关联的多个条目,并且该键由两个字符串组成。为了使事情变得更复杂,我需要有几个字符串(3+)与每个密钥对相关联。

有没有办法通过定义一个既包含密钥对又包含额外值的类来实现此目的?然后,我希望能够遍历此multimap,返回与特定密钥对匹配的所有条目。

2 个答案:

答案 0 :(得分:2)

您可以尝试以下两种方法之一:

typedef std::pair<std::string, std::string> keypair;

std::multimap<keypair, std::string>;          // #1
std::map<keypair, std::vector<std::string>>;  // #2

使用multimap的第一个解决方案意味着您只有一个容器,因此它可能感觉更简单,而第二个版本(矢量映射)的优点是所有与一个键相关的数据都存储在一起。根据用例的不同,可能会有更好的性能,因此您应该尝试这两种情况并进行配置。

顺便说一下,

keypair是一个完全有效的映射键,因为它通过两个组件的字典顺序提供排序。

答案 1 :(得分:1)

当然,只需将所有字符串组合成一个“虚拟”字符串,该字符串由一个字符串向量组成,该字符串是按字母顺序排序的。这将包含在key类中,类似于:

class key
{
    private:
        std::vector<std::string> key_values;

    public:
        key();
        void add_key(const std:string& key_value);

        bool operator==(const key& cmp);
        bool operator<(const key& cmp);
};

基本过程是使用key::add_key函数将键添加到内部key_values向量,并将键排序插入到该向量中。因此,矢量总是在词汇上排序。然后对于operator<函数,您将在词法上比较每个向量中的所有键。第一个key字符串在词法上“小于”另一个key将被排序为“小于”其他键。否则它将大于或等于另一个key。如果一个密钥既不小于或大于另一个key,那么根据STL多图的要求,弱排序将被视为“相等”。