我想创建一个带有键的Vector向量,它应该是一个Enum。
伪码:
MyContainer.at(Color::Red).at(3)
有人能给我一个线索,我会怎样做这么简单?有没有更好的数据结构然后矢量?
我想将Point-Cloud中的Points分割为各自的颜色代码。
答案 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
}
答案 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
已调整大小,其中包含vector
。 at
没有填充容器,只是在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);
}
};
}
但是,我再次建议反对这条道路。
最后一个选项是围绕array
或vector
编写自定义容器包装,为您执行std::size_t
投射。如果我要把它作为某种类型的图书馆发布,或者我感到无聊,我只会费心去做那种事情。
答案 2 :(得分:0)
vector是一个序列容器。如果您想将您的条目映射到某种不必连续的密钥,那么地图可能是更好的主意。