我有一个函数,需要一个多维参数std::vector
,需要将深度(或维数)作为模板参数传递。与其对这个值进行硬编码,我想编写一个constexpr
函数,该函数将std::vector
并将深度作为unsigned integer
值返回。
例如:
std::vector<std::vector<std::vector<int>>> v =
{
{ { 0, 1}, { 2, 3 } },
{ { 4, 5}, { 6, 7 } },
};
// Returns 3
size_t depth = GetDepth(v);
不过,这需要在编译时完成,因为此深度将作为模板参数传递给模板函数:
// Same as calling foo<3>(v);
foo<GetDepth(v)>(v);
有什么办法吗?
@JesperJuhl,我不是在寻找大小,我正在寻找深度。两件截然不同的事情。我想知道
—
tjwrona1992 '19
std::vector
相互嵌套的个数。例如,使用std::vector<std::vector<int>> v;
, GetDepth(v);
将返回2,因为它是二维向量。大小无关紧要。
半相关:嵌套
—
Peter Cordes
vector
并非总是做事的最佳方法。根据使用情况,手动对单个平面向量进行2d或3d索引编制可能会更有效。(只是整数数学,而不是从外部层次进行指针追赶。)
@PeterCordes更好的效率只是一个方面。另一个是平面类型可以更好地表示数组的连续性质。嵌套结构(可能具有不同的单个长度)从根本上说是一种类型不匹配,用于表示连续的n维超矩形。
—
康拉德·鲁道夫
命名法方面,标准库
—
dmckee ---前主持人小猫,
rank
对数组类型进行此查询(与张量的数学命名法一致)。也许这比“深度”更好。
std::vector
是运行时的内容,而不是编译时的内容。如果需要编译时大小的容器,请参阅std::array
。也; 请记住,constexpr
只表示“ 可以在编译时进行评估” -有没有承诺,这将是。可以在运行时对其进行评估。