2012-04-16 71 views
0

所以,我班的一个具有以下过载:使用相同的迭代循环通过两个标准::向量

DVector &operator+=(DVector const &other) { 
    if (vector.size() >= other.vector.size()) throw up; // lol. 

    std::for_each(other.vector.begin(); other.vector.end(), [](DVector const &pass) { 
     // huh? 
    }); 
} 

所以,这个想法是要总结两个向量的每一个成员(嗯,每个DVector实例包含一个std::vector<float>构件称为vector),例如:

如果我有含有一个DVector一个vector构件包含下列浮子:11.0, 23.5, 12.3,并且然后将含有14.0, 6.5, 7.7另一个,两者的总和应导致第一矢量保持25.0, 25.0, 25.0

问题:是否有任何方法可以循环遍历两个向量并且只使用一个迭代器求和它们的成员,假设向量的大小不是问题,或者我只是被迫使用了一个for (auto x: vector.size())

干杯,朱利安。

回答

2

的是采取两个输入和一个输出迭代一个std :: transfom算法。

我不知道你特定的矢量设计是如何构建的,但你应该能够根据你的需要修改以下内容。

std::transform(input1.begin(), input1.end(), //input1 
       intput2.begin(),    //input2 
       input1.begin(),    //output 
    [](double a, double b){ 
      return a+b; 
    }); 

你也可以为你的operator +也有一个不同的输出迭代器。

这里有一些参考

http://en.cppreference.com/w/cpp/algorithm/transform

http://www.cplusplus.com/reference/algorithm/transform/

而当你有一个不同的输出back_inserter是你的朋友:

http://en.cppreference.com/w/cpp/iterator/back_inserter

+0

无需任何不同为'operator +'输出迭代器,过载就像在'+ ='之间应用一样简单总和的两个成员。感谢您的详细解答。 – 2012-04-16 15:27:53

+0

好的,但是当你实现operator + =的时候,你只需要几个步骤就可以让一个正常的'+'只是试图预测下一个可能的问题。 :) – 111111 2012-04-16 15:29:40

+0

实际上,我想知道是否有任何需要通过值传递?,如果传递的参数都不会传递,通过引用(和const)传递会不会更有效被修改? – 2012-04-16 15:32:38

2

迭代器绑定到容器,因此您不能使用单个迭代器。你将不得不使用一个或两个独立的迭代器。

1

如果我正确地了解您的需求:

std::transform(vec1.begin(), vec1.end(), vec2.begin(), vec1.begin(), 
    [](float lhs, float rhs) { 
     return lhs + rhs; 
    });