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);

函数没问题,if ( 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;
    }
}

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

4

3 回答 3

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
于 2012-12-19T10:20:01.633 回答
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) .

我希望这会有所帮助。

于 2012-12-19T10:28:25.880 回答
0

不确定我是否正确地抓住了你的主要问题。你想转换 max_search 函数的返回值是float to struct S什么?我将按摩 KarithikT 的答案并添加更多详细信息:

要启用implicit conversion(从float到struct 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());
于 2012-12-19T10:33:09.023 回答