C++ 以枚举作为ID的向量中的向量

C++ 以枚举作为ID的向量中的向量,c++,c++11,C++,C++11,我想用一个键创建一个向量向量,它应该是一个枚举 伪代码: MyContainer.at(Color::Red).at(3) 有人能给我一个线索,我将如何做到这一点非常简单?有比vector更好的数据结构吗 我想将点云中的点分割为各自的颜色代码 向量是序列容器。如果您想将条目映射到某种不必连续的键,那么映射可能是一个更好的主意。向量是序列容器。如果您想将条目映射到某种不必连续的键,那么映射可能是一个更好的主意。使用std::map enum struct Color { Red, Blu

我想用一个键创建一个向量向量,它应该是一个枚举

伪代码:

MyContainer.at(Color::Red).at(3)
有人能给我一个线索,我将如何做到这一点非常简单?有比vector更好的数据结构吗


我想将点云中的点分割为各自的颜色代码

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

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

使用
std::map

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
}
enum结构颜色
{
红色
蓝色
};
int main()
{
地图m{{Color::Blue,{10,20,30}};
m[Color::Red]={1,2,3,4};
std::cout使用
std::map

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
}
enum结构颜色
{
红色
蓝色
};
int main()
{
地图m{{Color::Blue,{10,20,30}};
m[Color::Red]={1,2,3,4};

std::cout如果
enum
值是连续的,只需将它们强制转换为
std::size\t

std::vector<std::vector<double>> MyContainer;
// resize it
double d = MyContainer.at(std::size_t(Color::Red)).at(3)
另一种选择是用
std::unordered_map
替换最外层的容器,但这样会更慢,效率更低。
std::map
会更慢

如果您使用
enum
而不是
enum class
,您将保存上面的一些
std::size\t
强制转换,但我建议不要这样做。
无序映射
需要快速散列:

namespace std {
  template<>
  struct hash<Color> {
    std::size_t operator()(Color c) const {
      return static_cast<std::size_t>(c);
    }
  };
}
名称空间std{
样板
结构散列{
std::size\u t运算符()(颜色c)常量{
返回静态_-cast(c);
}
};
}
但我还是建议不要走这条路


最后一个选择是围绕
array
vector
编写一个定制的容器包装器,为您执行
std::size\t
转换。如果我打算将其作为某种库发布,或者如果我感到厌烦,我只会费心做这种事情。

如果您的
enum
值是连续的,只需将它们转换为
std::size\t

std::vector<std::vector<double>> MyContainer;
// resize it
double d = MyContainer.at(std::size_t(Color::Red)).at(3)
另一种选择是用
std::unordered_map
替换最外层的容器,但这样会更慢,效率更低。
std::map
会更慢

如果您使用
enum
而不是
enum class
,您将保存上面的一些
std::size\t
强制转换,但我建议不要这样做。
无序映射
需要快速散列:

namespace std {
  template<>
  struct hash<Color> {
    std::size_t operator()(Color c) const {
      return static_cast<std::size_t>(c);
    }
  };
}
名称空间std{
样板
结构散列{
std::size\u t运算符()(颜色c)常量{
返回静态_-cast(c);
}
};
}
但我还是建议不要走这条路



最后一个选择是围绕
array
vector
编写一个定制的容器包装器,为您进行
std::size\t
转换。如果我打算将其作为某种库发布,或者如果我觉得无聊,我只会费心去做这种事情。

您考虑过使用向量映射吗?或者一个普通数组或向量的
std::array
。谢谢@Streppel这是个好主意。你考虑过使用向量映射吗?或者只是一个普通数组或向量的
std::array
。谢谢@Streppel这是个好主意。@user1767754如果你的枚举从
0
开始并且是连续的,数组可能是一个更好的选择。这将是一个好主意带有完美散列的h映射:-)为什么
map
而不是
无序映射
?@Yakk更少的击键次数?当然
无序映射
也会起作用,如果枚举是连续的,juan的数组解决方案也会起作用。OP必须自己测试并决定什么最有效。@juanchopanza-hmmm它们也可以……那么我必须gnore前端。如果你愿意,你可以通过snippet@user1767754“忽略前端”是什么意思?@user1767754如果您的枚举以
0开始并且是连续的,那么数组可能是一个更好的选择。它将是一个具有完美哈希的哈希映射:-)为什么
map
而不是
unordered_map
?@Yakk击键次数更少?当然
unordered_map
也会起作用,如果枚举是连续的,juan的数组解决方案也会起作用。T他必须自己测试和决定什么最有效。@juanchopanza-hmmm他们也可以……然后我不得不忽略前端。如果你愿意,你可以通过考试snippet@user1767754“忽略前端”是什么意思?因此,当我使用单向量版本并使用旧式枚举时,我可以保存“std::size_t”?“如果使用enum而不是enum类,则会保存上面的一些std::size\t强制转换。。。"为什么…?为什么不能自动转换枚举类呢?@Yakk AdamNevraumont这就像一个没有答案的lol。为什么要这样设计呢?这不就是让每个人的生活都更艰难吗?不允许它像普通的
枚举类一样自动转换有什么好处?所以当我使用单向量版本并使用旧的方法e时num,我可以保存'std::size_t'?“如果您使用enum而不是enum类,您将保存上面的一些std::size_t强制转换…”为什么…?为什么不能自动转换枚举类呢?@Yakk AdamNevraumont这就像一个没有答案的lol。为什么要这样设计呢?这不就是让每个人的生活都更艰难吗?不允许它像普通的
枚举类一样自动转换有什么好处?