2014-11-06 96 views
0

所以我这段代码:C++向量加法补偿误差:

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

vector <int> suma(vector <int> t, vector <int> m){ 
    int i; 
    vector <int> sumat; 
    for(i=0; i<t.size();i++){ 
     sumat[i]=t[i]+m[i]; 
    } 
    return sumat; 
    }  
int main(){ 
    vector <int> a(4,0); 
    a[0]=5; 
    a[1]=5; 
    a[2]=3; 
    a[3]=0; 
    vector <int> b(4,0); 
    b[0]=5; 
    b[1]=5; 
    b[2]=3; 
    b[3]=0; 
    cout<< suma(a,b) <<endl; 
} 

这是比较错误我得到的最后一行COUT:

[Error] no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream}' and 'std::vector')

这是为什么?

回答

-1

没有定义如何向输出流发送向量。

你或许应该定义一个函数,把整数向量成一个字符串,然后调用

cout<< YourPrintFunction(suma(a,b)) <<endl; 
+0

呵呵,但是funcion还好吗? – 2014-11-06 23:47:32

+0

不需要。在使用operator []之前,您需要将元素推回到sumat或调整其大小。你还需要检查't'和'm'是否是相同的大小,或者只是列举到较小的那个边界。 – NtscCobalt 2014-11-06 23:53:15

+0

@Burnsedd不,我回答了你的问题,但还有很多其他问题。 – patros 2014-11-07 18:20:26

2

C++没有定义矢量一个ostream operator <<,很可能是因为有很多的不同你可以输出它们的方式。每行一个条目,如下所示,或用逗号分隔,或包含在括号内。

您可以使用“操作符重载”为向量定义自己的<<运算符。这允许相同的操作员根据调用参数调用不同的代码。

全球运营商过载的方法有一个特定调用约定,第一个参数是所述对象的引用在运算符左侧(例如coutcout << v,第二个参数是在运算符右侧的值( v)。对于<<运营商,你通常定义参数为const引用,因为你通常不会更改值时,它是输出。

<<操作的返回值通常是第一个参数。这允许您将呼叫连锁到<<,如cout << vec << "Done" << std::endl

例如: -

ostream &operator << (ostream &out, const vector<int> &vec) 
{ 
    for (auto &&val : vec) 
     out << val << std::endl; 
    return out; 
} 

如果无法C++ 11的使用情况,您可以使用老式的循环是这样的:

ostream &operator << (ostream &out, const vector<int> &vec) 
{ 
    for (vector<int>::size_type i = 0; i < vec.size(); i++) 
     out << vec[i] << std::endl; 
    return out; 
} 

或其他使用迭代器类似的循环。

PS。无关注 - 您需要在代码中初始化sumat的大小,或使用push_back。目前它会崩溃。

+0

现在正在工作,但你能解释我是如何工作的吗? – 2014-11-07 00:00:05

+0

我将编辑帖子以更具描述性。 – 2014-11-07 00:02:04

+0

非常感谢! a – 2014-11-07 00:14:39

0

你为什么不打印sumat内容的SUMA函数中这样

void suma(vector <int>& t, vector <int>& m, vector<int>& output){ 
     // Assuming that both vectors t and m are of the same size. 
     for(size_t i=0;i<t.size();i++){ 
      output.push_back([i]+m[i]); 
     } 
    }  

请注意,我改变从向量函数为void的返回值。 然后在你的主函数中,你可以调用这个函数。

vector<int> sumat; 
suma(a, b, sumat); 

然后你就可以继续打印sumat矢量像这样的输出:

for(size_t i = 0; i < sumat.size(); ++i) 
{ 
    cout << sumat[i] << endl; 
} 
+0

不好的做法。 suma有一份工作。另一个功能可以打印。您正在为功能添加副作用。将IO等非常缓慢的操作强加到可能需要快速执行的数学函数中尤其糟糕。 – 2015-07-22 22:13:17

+0

同意@KennyOstrom。编辑答案。 – 2015-07-22 22:49:57

0

你应该改变你的代码如下:

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

vector<int> suma(vector<int> t, vector<int> m){ 
    int i; 
    vector<int> sumat(4); 
    for(i=0; i<t.size();i++){ 
     sumat[i]=t[i]+m[i]; 
    } 
    return sumat; 
    } 
int main(){ 
    vector<int> a(4,0); 
    a[0]=5; 
    a[1]=5; 
    a[2]=3; 
    a[3]=0; 
    vector<int> b(4,0); 
    b[0]=5; 
    b[1]=5; 
    b[2]=3; 
    b[3]=0; 
    vector<int> res = suma(a,b); 
    for(size_t i = 0; i<res.size(); i++) 
     cout<<res[i]<<endl; 
} 

有一些错误您的代码: (1)当您使用sumat[i]时,您应该保留载体sumat的维护性。 vector<int> sumat只是决定一个向量,如果你想插入到sumat的值,你可以使用push_back。 (2)不能直接使用coutvector对象,可以为vector对象编写覆盖运算符,也可以为vector输出元素。