c++ - 传递指向特征类型 vector 的 std::iterator

标签 c++ eigen

我有一个大std::vector<Eigen::Array<float, Eigen::Dynamic, 1>>坐在内存中的某个地方。我可以将此 vector 的迭代器传递给函数,如下所示:

typedef std::vector<Eigen::Array<float, Eigen::Dyanamic, 1>>::iterator ArrayIterator;

void MyFunction(ArrayIterator v1_beg, ArrayIterator v1_end,
                ArrayIterator v2_beg, ArrayIterator v2_end) {

   Eigen::Array<float, Eigen::Dynamic, 1> tmp(*v1_beg.size());
   tmp.setZero(); 
   while (v1_beg != v1_end) { tmp += *v1_beg++ * *v2_beg++; }

}

我知道路过Eigen如果想避免临时变量,类型到函数可能是一件棘手的事情。上述解决方案似乎避免了临时变量(例如,打印 &(*v_beg).data() 给出了外部 vector 中位置的正确内存地址)。然而,由于传递纯粹的微妙之处Eigen类型,看起来几乎“太容易了”。我的问题是:我是否可以确信上述方法不会导致创建临时对象?或者当我取消引用( *v1_beg )时可能会调用临时变量?

感谢您的评论!

最佳答案

在您的示例中 *v1_beg将返回对 Eigen::Array<float, Eigen::Dynamic, 1> 的引用(顺便说一句,与 Eigen::ArrayXf 相同),直到该位置都没有调用特征代码。然后实际的特征代码调用(半伪代码):

ArrayXf::operator+=(operator*(const ArrayXf&, const ArrayXf&))

这确实可以在没有临时变量的情况下工作。

关于c++ - 传递指向特征类型 vector 的 std::iterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40218354/

相关文章:

c++ - WChars、编码、标准和可移植性

c++ - 为 vector<vector<>> 分配内存的捷径

c++ - 使用Eigen库进行sparseLU并显示L&U?

c++ - 随机(只读)访问 Eigen::SparseVector 的元素

c++ - 可以在可变 lambda 中更改 `this` 吗?

c++ - 模板模式匹配

c++ - 在 Visual Studio 6 中从 VB 调用 VS2010 C++ dll

c++ - 如何在 Windows 上的 CMakelist.txt 中包含 Eigen 库

c++ - Eigen 创建超/次对角矩阵

c++ - Eigen :将浮点矩阵乘以 bool vector