矢量与矢量与ENUM作为ID

时间:2014-05-13 21:13:04

标签: c++ c++11

我想创建一个带有键的Vector向量,它应该是一个Enum。

伪码:

MyContainer.at(Color::Red).at(3)

有人能给我一个线索,我会怎样做这么简单?有没有更好的数据结构然后矢量?

我想将Point-Cloud中的Points分割为各自的颜色代码。

3 个答案:

答案 0 :(得分:3)

请改用std::map<Color, std::vector<int>>

enum struct Color
{
  Red,
  Blue,
};

int main()
{
  std::map<Color, std::vector<int>> m{{Color::Blue, {10,20,30}}};
  m[Color::Red] = {1,2,3,4};

  std::cout << m[Color::Red].at(3) << '\n'; // prints 4
  std::cout << m[Color::Blue][0] << '\n';   // prints 10
}

Live demo

答案 1 :(得分:3)

如果您的enum值是连续的,只需将其转换为std::size_t

std::vector<std::vector<double>> MyContainer;
// resize it
double d = MyContainer.at(std::size_t(Color::Red)).at(3)

现在,您必须确保MyContainer已调整大小,其中包含vectorat没有填充容器,只是在vector超出范围时检查边界和抛出。

现在,随着您的点数固定,我们可以取消一个vector

enum class Color {
  Red,
  Green,
  Blue,
  count, // automatically becomes the number of elements
};
std::array< std::vector<int>, std::size_t(Color::count) > MyContainer;
MyContainer[std::size_t(Color::Red)].push_back(3);

另一种方法是用std::unordered_map替换最外面的容器,但这样会更慢,效率更低。 std::map会更慢。

如果您使用enum代替enum class,则会保存上述std::size_t个演员,但我会反对。 unordered_map需要快速哈希:

namespace std {
  template<>
  struct hash<Color> {
    std::size_t operator()(Color c) const {
      return static_cast<std::size_t>(c);
    }
  };
}

但是,我再次建议反对这条道路。

最后一个选项是围绕arrayvector编写自定义容器包装,为您执行std::size_t投射。如果我要把它作为某种类型的图书馆发布,或者我感到无聊,我只会费心去做那种事情。

答案 2 :(得分:0)

vector是一个序列容器。如果您想将您的条目映射到某种不必连续的密钥,那么地图可能是更好的主意。