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

()の場合、関数はOKmx.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 に答える