在C++中存储和检索多个键

Ste*_*eng 1 c++ stl

我有一些检索值所需的整数键.基于密钥存储和检索值的最有效方法是什么?

目前,我正在将三个键转换并组合成一个字符串,并将键值对存储在一个映射中.但是,我认为应该有一种更有效的方法,仅基于整数值,例如基于三个键生成单个键.有什么想法吗?

谢谢.

Jer*_*fin 9

你几乎可以肯定比转换成字符串更好(这通常是一个非常慢的操作).如果你的三个项目具有足够小的范围,你可以进行一些移动和添加以将它们组合成一个具有更大范围的单个整数.

缺乏这一点,您可以创建一个包含三个整数的结构,并定义operator<以合理的方式比较它们:

class key { 
    int a, b, c;
public:
    bool operator<(key const &other) { 
        if (a < other.a)
            return true;
        if (a > other.a)
            return false;
        if (b < other.b)
            return true;
        if (b > other.b)
            return false;
        if (c < other.c)
            return true;
        return false;
    }
};
Run Code Online (Sandbox Code Playgroud)

编辑:对于那些关心它的人,使用(std | tr1 | boost):: tuple不会改变答案的字符,但会消除大部分代码.元组非常相似std::pair,除了它支持任意数量的项而不是两个.对于上面的示例,您可以使用以下内容:

#include <tuple>

namespace stdx = std::tr1;    // or stdx=boost::tr1, etc.

typedef stdx::tuple<int, int, int> key_t;

std::map<key_t, whatever> my_map;
Run Code Online (Sandbox Code Playgroud)

tuple假设类型是可比较的(即,用于比较具有相同元素数量的两个元组,并且相应元素的类型是可比较的),自动定义比较运算符.在这种情况下,它进行字典比较(即,比较的结果是来自第一对不相等的相应元素的结果 - 不存在这样的元素,两者比较相等).