2010-09-04 45 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