Vector中的Vector,以ENUM作为ID
Vector in Vector with ENUM as ID
我想创建一个向量的向量与一个关键,这应该是一个Enum。
伪代码:
MyContainer.at(Color::Red).at(3)
谁能给我一个提示,我怎么做这个很简单?有没有比vector更好的数据结构?
我想把点云中的点分割成它们各自的颜色代码。
如果您的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
s在它里面。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
强制转换。只有当我打算把它作为某种类型的库发布时,或者当我感到无聊时,我才会费心做这种事情。
使用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
}
现场演示
vector是序列容器。如果您想将条目映射到某种键,而不必是连续的,那么映射可能是一个更好的主意。
相关文章:
- 以 Eigen::Vector 作为参数
- Boost.interprocess Vector 作为类成员
- 为什么 std::when_any 使用 std::tuple 而不是 std::vector 作为其结果类型?
- 如何使用 std::vector 作为参数调用 Fortran 77 C++函数?
- 通过std :: vector作为const float *
- 如何使用std :: vector作为c 中std :: unordered_map的密钥类型
- std :: vector作为原始数组
- 使用 mpl::vector 作为函数表
- 创建带有括号的 std::vector 作为默认大小
- 将std::vector作为模板模板参数传递时出错-在GCC中有效,在MSVC中失败
- struct vs vector作为数据持有者
- 将std::vector作为输入/输出引用参数传递时丢失了一些数据
- C++ std::vector 作为 std::function 的参数
- 使用 std::vector 作为简单缓冲区是否是一种好的做法
- 是否可以指定一个空的 std::vector 作为默认参数
- EXC_BAD_ACCESS将 std::vector 作为参数传递给函数时
- std::vector 作为模板函数参数
- 使用 std:vector 作为低级缓冲区
- 使用 std::vector 作为 std::map 的键在未找到和使用 reserve() 时不会返回 end()
- 将类的std::vector作为同一类的属性是一个很好的设计选择