C++ 最快的 3D 矢量循环扫描
c++ fastest loop scan over 3D vector
我想知道在 3D 矢量的每个元素上执行方法的最快方法是什么。
假设我们有:
std::vector<vector<vector<CLS>>> myVec;
我想以最快的方式执行以下循环:
for(int cycle=0;cycle<10;cycle++) // do it 10 times
{
for(int i=0;i<myVec.size();i++)
{
for(int j=0;j<myVec[i][constant].size();j++)
{
foo(myVec[i][constant][j]);
}
}
}
值得一提的是,就我而言,中期指数始终保持不变。使用 std::vector 是否足够快,或者您建议使用其他类型的容器?
期待您的帮助。谢谢
迭代
器的使用应该更快(您不必在每次调用foo
时查找整个数组)。
typedef std::vector<CLS> v1;
typedef std::vector<v1> v2;
typedef std::vector<v2> v3;
for(int cycle=0;cycle<10;cycle++) // do it 10 times
{
for(v3::const_iterator itOuter = myVec.begin(); itOuter != myVec.end(); ++itOuter)
{
const v1& vec = (*itOuter)[constant];
for(v1::const_iterator itInner = vec.begin(); itInner != vec.end(); ++itInner)
foo(*itInner);
}
}
不过,我没有测量它(甚至没有尝试编译,所以请原谅任何错别字)
以下内容会更快:
for(int i=0, int vecSize = myVec.size();i<vecSize;i++)
{
for(int j=0, int currentLineSize = myVec[i][constant].size();j<currentLineSize;j++)
{
foo(myVec[i][constant][j]);
//copy-paste this 10 times instead of having the outer loop
}
}
如果您对尺寸有所了解,则可以执行更多展开。
可能是"最快的方法"(也是尽可能少C++的方法,尽管它仍然有效C++)将遵循以下行:
const unsigned dim1 = 10; //first dimension
const unsigned dim2 = 20; //second
const unsigned dim3 = 30; //third
const unsigned nElem = dim1 * dim2 * dim3;
CLS myVec[nElem];
CLS *p = myVec, *q = myVec + nElem;
while (p < q)
{ foo(*p);
++p;
}
这消除了索引的所有计算,因为foo()
似乎只依赖于所讨论的CLS
元素的值,而不依赖于它在数组中的位置。当然,以 3D 方式访问myVec
变得更加复杂(myVec[x * dim1 * dim2 + y * dim1 + z]
等等 - 只是明确所有索引计算C++通常为您做......
更改循环以"切片"数组以使一个维度保持不变会使它稍微复杂一些(本质上使其成为双重嵌套循环,在内部循环的终止处向指针添加额外的偏移量)。有点像这样(尽管我的尺寸可能颠倒了):
while (p < q)
{ CLS *r = p + dim3;
while (p < r)
{ foo(*p);
++p;
}
p += dim2;
}
您可以创建一个递归函数对象:
class Foo {
public:
template<typename Container>
void operator()(Container& container) {
for_each(container.begin(), container.end(), *this);
}
void operator()(CLS cls) {
// do what you want
}
};
Foo foo;
foo(myVec);
相关文章:
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 为什么在这个代码结束循环中没有得到结束
- 在基于范围的for循环中使用结构化绑定声明
- 为什么 EOF 在循环扫描期间没有终止?
- 文本通过循环扫描分组内容进行排除线
- C++ 最快的 3D 矢量循环扫描
- 在 c/c++ 中循环扫描和打印数组