2012-12-19 51 views
0

我是编程的新手,特别是C++。我有一个任务,它的一部分是使用结构编写一个函数。使用结构定义函数

struct S { 
    float m; //how many 
    int h; //where 
    float mx; 
}; 

int main() { 
    S s; 
    s.m=0.5; 
    s.h=1; 

    vector<float> v(10); 
    for (int i=0;i<10;i++) 
     v[i]=sin(i); 
    S mx = max_search(v); 

该功能没问题,如果(mx.m>0.98935 && mx.m<0.9894 && mx.h==8)。

我出来了这个函数的代码,但我知道,这是相当有缺陷的。

float max_search(vector<float> v) { 
    int max=0; 
    for (int i=0; i<v.size(); i++) { 
     if (v[i]>max) { 
     max=v[i]; 
     } 
    return max; 
    } 
} 

我不知道,我应该怎么处理函数的类型,也许返回值也是错误的。

+0

您正在返回您的for循环。 Soit将只执行一次。 – ryadavilli

+0

由于您不需要复制矢量,因此可以通过'const'引用传递它。 – 2012-12-19 10:23:43

回答

0

不知道我是否正确地捕捉到您的主要问题。你想转换max_search函数的返回值是float to struct S?我会按摩的KarithikT的答案,并添加更多的细节:

要启用implicit conversion(从浮子结构S),需要转换功能添加到S

struct S { 
    S():m(0.0), h(0), mx(0.0){ }   // 
    S(float x):m(0.0), h(0), mx(x){ } // to enalbe convert float to S 
    float m; //how many 
    int h; //where 
    float mx;  
}; 

float max_search(const vector<float>& v) { // pass by const reference 
    float max=0.0f; 
    for (int i=0; i<v.size(); i++) { 
     if (v[i]>max) { 
     max=v[i]; 
     } 
    } 
    return max; 
} 

你也可以使用std :: max_element到找到容器中的最大元素:

vector<float> v(10); 
for (int i=0;i<10;i++) { 
    v[i]=sin(i); 
} 
S mx = *std::max_element(v.begin(), v.end()); 
0

你想要你的return max;在最外层。现在它返回for循环的每一次迭代,这意味着你只有1次迭代。

float max_search(vector<float> v) { 
    float max=0.0f; <------------ 
    for (int i=0; i<v.size(); i++) { 
     if (v[i]>max) { 
     max=v[i]; 
     } 
    -------------- 
    } 
    return max; <------------ 
} 

,我想你想这样称呼它s.mx = max_search(v);

您还可以使用std::max_element

s.mx = std::max_element(v.begin(),v.end()); // (begin(v),end(v)) in c++11 
+0

Aww,谢谢我不注意,我纠正了max_search()中的错误。其实,你是对的,但我不能在main()中改变任何东西,这就是为什么'S mx = max_search(v)'必须留下来的原因。所以我不断收到这样的信息:“从'float'转换为非scolar类型'S'请求”。 – user1846813

+0

当然,因为你真正想要做的是's.mx = max_search(v);' – adripanico

+0

@ user1846813如果你不能改变的代码是你的老师给出的,你可能要重新确认它是不是一个错字,因为整个声明只是尖叫错字! –

0

如果要声明功能float,为什么要退的int

float max_search(vector<float> v) { 
    float max = v[0]; //this way you avoid an iteration 
    for (int i = 1; i < v.size() - 1; i++) 
    if (v[i] > max) max = v[i]; 
    return max; 
} 

你也可以使用一个迭代器来做到这一点:

float max_search(vector<float> v) { 
    float max = .0; 
    for (vector<float>::iterator it = v.begin(); it != v.end(); ++it) 
    if (*it > max) max = *it; 
    return max; 
} 

在第一个代码块。减去1〜v.size是很重要的,其他的方式,你会尝试访问该不元素存在。如果你的代码没有返回你的分段错误,那是因为std::vector是安全的。这意味着std::vector尝试来访问该元素,但无论如何,你正在做最后一次不必要的迭代。这就是为什么使用迭代器更好。

@KarthikT说:你试图在每次迭代中返回max,所以,在第一次迭代之后,函数返回值并停止执行,总是检索你向量的第一个值(如果这个值大于0)。

我希望这个帮助。

+0

在第二个示例中,您既没有声明(或初始化)'max'也没有将其返回... – Alnitak

+0

对不起,现在已修复 – adripanico

+0

再次编辑。在第一个代码块中,我改变了'max = v [1]'max = v [0]'。 – adripanico