2016-03-21 4 views
1

私は上記のコードをコンパイルしようとしていると私は取得しています:範囲ベース-ためのループが98モードのループとベクトルについてレンジベースのC++ 98

int max_even = timer_table[0]; 
int max_odd = timer_table[1]; 
bool even = true; 
for(int v : timer_table) 
{ 
    if(even) { 
    if(v > max_even) 
     max_even = v; 
    } else { 
    if(v > max_odd) 
     max_odd = v; 
    } 
    even = ! even; 
} 

std::cout << "max even " << max_even << " max odd " << max_odd << std::endl; 

C++で許可されていませんc++98でそれをコンパイルする方法はありますか?

+4

をあなたは、一般的にC++標準規格は、新しい使用することはできませんコンパイラがサポートするよりも* C++ 98標準を使用する必要がある場合は、C++ 98標準コードを記述します。 – crashmstr

+2

ループを通常のイテレーターループに変更します。 – NathanOliver

+2

例: [この範囲(参考用)](http://en.cppreference.com/w/cpp/language/range-for)では、範囲外の値を使用して同等の値が表示されます。 –

答えて

1

最初のアプローチは、通常のforループに置き換えることです。より正確な答えを得るには、timer_tableがどのように宣言されているのか、そのサイズをどこで得ることができるかを知る必要があります。

int max_even = timer_table[0]; 
int max_odd = timer_table[1]; 
bool even = true; 
int timer_table_size = sizeof(timer_table)/sizeof(timer_table[0]); 
for(int i = 0, v = timer_table[0]; i < timer_table_size; ++i, v = (i<timer_table_size)?timer_table[i]:0) 
{ 
    if(even) { 
    if(v > max_even) 
     max_even = v; 
    } else { 
    if(v > max_odd) 
     max_odd = v; 
    } 
    even = ! even; 
} 

std::cout << "max even " << max_even << " max odd " << max_odd << std::endl; 
+1

これはOPのループと同じではありません。 'v'は' timer_table'の各要素でなければなりません – NathanOliver

+0

ああ、そうです。私はそれを修正する – user2807083

1

は、C++ 98のコードの作業を行うには、イテレータのアプローチを使用する必要があります

for(std::vector<int>::iterator i = timer_table.begin(); i != timer_table.end(); ++i) 
{ 
    int v = *i; 
    ... 

するか、それはプレーンな配列の場合:

for(int *i = timer_table; i < sizeof(timer_table)/(sizeof(timer_table[0]); ++i) 
{ 
    int v = *i; 
    ... 
+0

'timer_table'がベクトルであることをどうやって知っていますか? – NathanOliver

+0

1つではありません。しかし、他の答えはそれが単純な配列であると仮定します。誰がそれをどのように知っていますか? – owacoder

+0

または、あなた自身のbegin関数を作成することはできますが、どちらの場合でもOPに答えを与えることはできません。 – NathanOliver

2

はさんがいると仮定しましょう配列timer_tableNの要素を持ちます。あなたは、配列のすべての要素をトラバースすることを可能にするループのいずれかの種類を使用することができます実際には

int max_even = timer_table[0]; 
int max_odd = timer_table[1]; 
bool even = true; 

for(const int *p = timer_table + 2; p != timer_table + N; ++p) 
{ 
    if(even) { 
    if(max_even < *p) 
     max_even = *p; 
    } else { 
    if(max_odd < *p) 
     max_odd = *p; 
    } 
    even = !even; 
} 

std::cout << "max even " << max_even << " max odd " << max_odd << std::endl; 

を書くことができます。この場合

。:)

3

コンパイラがでコンパイルしようとしたように見えますC++98は、デフォルトでは範囲ベースのforループをサポートしていません(下記のel.pescadoのコメントを参照)。

C++ 11
  • そうのようなループのための単純なを使用を使用するようにコンパイラを設定し

    1. ::次の2つのオプションがあり

      int max_even = timer_table[0]; 
      int max_odd = timer_table[1]; 
      bool even = true; 
      for(int i = 2 ; i < table_length; i++) 
      { 
          if(even) { 
           if(timer_table[i] > max_even) 
           max_even = timer_table[i]; 
          } else { 
           if(timer_table[i] > max_odd) 
           max_odd = timer_table[i]; 
          } 
          even = ! even; 
      } 
      
      std::cout << "max even " << max_even << " max odd " << max_odd << std::endl; 
      
  • +0

    これは最高の答えです。コンパイラが "range-based-forループはC++ 98モードでは許可されていません"と言いますと、それはそれをサポートしていますが、デフォルトの設定ではありません。だから、解決策は、C++ 11の機能を有効にするように設定することです。コンパイラがC++ 11をサポートしていなかった場合、汎用構文エラーが発行されます。 C++ 98でこのループを書き直すとコードが悪くなってしまいます。 –

    +0

    精度をありがとう!私は私の答えを更新します。 「C++ 98でこのループを書き直すと、コードは悪くなく良くなる」とはどういう意味ですか? – ShadowMitia

    +0

    範囲ベースのループははるかに簡潔で読みやすい。より冗長なコード⇒より良いコード。それは私の個人的な意見です。 –

    関連する問題