什么是最有可能使用的方法来处理多个键来使用STL容器获取值?

时间:2016-05-11 14:33:48

标签: c++ data-structures stl std

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

考虑下表

+-------+--------+------------+--------+
| 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:使用嵌套地图

int key1 ; /* =EMPID */
int key2; /* =DEPTID */
int key3; /* =COLLEGE ID */
std::map<int,std::map<int,std::map<int,string>>> l_container;

1 个答案:

答案 0 :(得分:1)

首先 - 首先创建一个类,用于定义这种容器所需的内容。我相信它会是这样的:

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背后的重要性并不是那么重要。使用这种方法,当您发现一种方法比其他方法更好时,您可以随意更改它...

因此,让我们讨论一下私人部分:

  

方法1:键为字符串

std::map<std::string,std::string> m_table;

那会有效 - 但我真的不鼓励你使用它。这是不必要的复杂,你肯定会在大量结果的情况下看到性能下降...

  

方法2:使用嵌套地图

std::map<int,std::map<int,std::map<int,std::string>>> l_container;

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

方法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)。