我有三个键和一个与该键关联的值。
所有键都是整数值。

考虑下表

+-------+--------+------------+--------+
| EMPID | DEPTID | COLLEGE ID | RESULT |
| 1     | 1      | 1          | A      |
| 1     | 2      | 2          | B      |
| 1     | 3      | 3          | C      |
| 2     | 1      | 1          | D      |
| 2     | 2      | 2          | E      |
| 2     | 3      | 3          | F      |
+-------+--------+------------+--------+

以下哪种方法最好?

方法1:键为字符串
string key; /* EMPID:DEPTID:COLLEGE ID */
std::map<int,string> l_container;

方法2:使用嵌套 map
int key1 ; /* =EMPID */
int key2; /* =DEPTID */
int key3; /* =COLLEGE ID */
std::map<int,std::map<int,std::map<int,string>>> l_container;

最佳答案

首先-首先创建类,该类定义您从此类容器中需要的内容。我相信会是这样的:

class ResultTable
{
public:
   void addResult(int key1, int key2, int key3, std::string value);
   void removeResult(int key1, int key2, int key3);
   std::string getResult(int key1, int key2, int key3) const;
   bool isPresent(int key1, int key2, int key3) const;
private:
  ... m_table; // real container here
};

因此,在ResultsTable的私有(private)部分中拥有什么并不重要。通过这种方法,当您发现一种方法比其他方法更好时,可以自由地对其进行更改。

因此,让我们讨论一下放入私有(private)部分的内容:



那行得通-但我真的不鼓励您使用它。这是不必要的复杂操作,如果有大量结果,您肯定会看到性能下降...



从 map 上删除键时,此方法有缺点。您可能会在删除最后一个元素后将嵌套 map 留空了...

方法3:使用组合键映射
std::map<std::tuple<int,int,int>, std::string> m_data;
// or
std::map<std::array<int,3>, std::string> m_data;

这种方法(已经在注释中提到)应该是最好的。我个人更喜欢使用std::array作为包含相同类型元素的键的版本(此处为int)。

关于c++ - 使用STL容器处理多个键以获取值的最可能使用的方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37165826/

10-11 22:38
查看更多