2010-09-04 37 views
1

我想补充以下两个向量是代码片段: -向量加法运算

#include <iostream> 
#include <vector> 
using namespace std; 

int main() 
{ 
     unsigned int i = 0; 
     vector <float> v1; 
     vector <float> v2; 
     vector <float> v3; 



     cout << "Filling the Numbers\n"; 
     for (i=5;i < 125 ; i = i + 5) { 
      v1.push_back(i/10); 
      v2.push_back(i/100); 
     } 

     cout << "Adding the numbers\n"; 
     for (i = 0; i < v1.size(); i++) { 
       v3[i] = v1[i] + v2[i]; 
     } 

     cout << "Printing the numbers\n"; 
       for (i = 0; i < v3.size() ; i++) { 
         cout << v3[i]; 
       } 


     return 0; 
} 

该计划在18号线崩溃在我看来,我需要做的操作符重载的+操作。请帮助我是C++的新手。

感谢 Arpit

+0

第18行在哪里? “崩溃”是什么意思?它是否编译? – fredoverflow 2010-09-04 14:38:35

+0

可能重复[如何在两个容器的元素之间执行成对二元操作?](https://stackoverflow.com/questions/8541276/how-do-i-perform-a-pairwise-binary-operation-两个元素之间的元素) – 2017-09-20 13:12:21

+0

@underscore_d:这个问题已经在'10 ... – Pixelchemist 2017-09-20 22:24:05

回答

7

此行不起作用,因为没有v3[i]分配:

v3[i] = v1[i] + v2[i]; 

你有两个选择,要么之前使用“的push_back”

v3.push_back(v1[i] + v2[i]); 

或调整阵列为给定大小手:

v3.resize(v1.size()); 

如果你push_back,这将是很好的预先分配的空间反正:

v3.reserve(v1.size()); 

最后,你可以尝试在std::valarray而不是读了,因为这些操作都已经内置到它!

编辑:是的,作为约翰内斯指出,你有浮点除法问题:>

1

v3[i] = v1[i] + v2[i];

你分配给不存在的元素。改为尝试v3.push_back(v1[i] + v2[i]);

另外,您可能需要i/10.0而不是i/10,否则您的结果将被舍入。

4

首先,你需要做一个浮点除法

v1.push_back(i/10.0f); 
v2.push_back(i/100.0f); 

然后,你需要有v3i变量空间或使用push_back

v3.push_back(v1[i] + v2[i]); 
+0

+1:注意别人(包括我自己)似乎忽略的另一个问题:D – 2010-09-04 14:47:08

1

你写入V3矢量,但你没有分配任何空间。

尝试添加:

v3.reserve (v1.size()); 

你的第一和第二环路之间。

1

我认为问题是v3 [i]不起作用,因为矢量的零元素开始。你想要做什么或者是:

v3.push_back(v1[i] + v2[i]); 

或预分配的载体

v3.resize(v1.size()); 

或最终解决方案,我会做的是

v3.reserve(v1.size()); 

for (i = 0; i < v1.size(); i++) { 
    v3.push_back(v1[i] + v2[i]); 
} 

,因为这避免了再次调整矢量然后再次。

7

为了避免您遇到了明显的缺陷,你可以做到这一点作为一种替代方案:

#include <algorithm> // for transform 
#include <functional> // for plus 

std::transform(v1.begin(), v1.end(), v2.begin(), std::back_inserter(v3), std::plus<float>()); 
+0

不错,比我使用的循环迭代更加干净。任何想法,如果这种方式实际上更快? – saccharine 2013-03-20 23:53:25

+0

@saccharine:它应该和你写的最好的循环一样快。 'std :: transform'中的所有工作都是通过模板的魔力发生的,因此它得到了大量优化和内联,并且应该产生与天真循环完全相同的目标代码。 – greyfade 2013-03-21 00:54:52