1

例えば:

 vector<int> something;
 //imagine i add some elements to the vector here

 int* pointy;
 for (int i = 0; i < something.size(); pointy = &something[i++]) {
      //do some work with pointy
 }

それは機能しているようで、ラインを節約できますが、これが原因で奇妙なバグがラインに現れる危険はありますか?

4

5 に答える 5

13

pointyは最初の反復で割り当てられていないため、これは正しくない可能性があります。ループが最初の反復中に逆参照されない場合pointyは問題ない可能性がありますが、ループの本体を見ないと判断できません。

を使用しているためstd::vector、イテレータを使用すると、宣言する必要がないため、別の行を節約できますpointy。現在の反復子からi減算することなく、オフセットを決定できます。something.begin()

for (vector<int>::iterator iter = something.begin() ; iter != something.end() ; ++iter) {
    cout << "Item at index " << (iter - something.begin()) << " is " << *iter << endl;
}
于 2013-06-02T11:58:24.613 に答える
6

はい、dasblinkenlight が指摘したように、それは危険です。しかし、この種の問題を解消する簡単な方法があります。

最初に単純さと読みやすさを考慮してコードを記述します。ループを最小限の行数に圧縮してもパフォーマンスは向上しません。圧縮したとしても、ループがボトルネックであることがプロファイラーから通知されない限り、気にする必要はありません。

一方で、コードが読みにくくなり、おそらくバグが発生しやすくなります (おそらくお気づきでしょう)。

C++11 では、範囲ベースのforループの使用を検討してください。

for (int& p : something)
{
   // ...
}

C++03 では、std::for_each()、または反復子に基づく従来のループの使用を検討してください。

for (std::vector<int>::iterator i = something.begin(); i != something.end(); ++i)
{
    // use *i to refer to the current pointy
    // use (i - something.begin()) to get its index
    // ...
}
于 2013-06-02T11:59:38.947 に答える
1

iではないので大変危険unsignedです。まれに爆発することがあります。:)

于 2013-06-02T12:02:38.253 に答える
0

私としては、より大きなオブジェクトに対して次のように std::vector を処理するのが好きです。

std::vector<int*> mynumbers;
//add elements here like this:
int somenumber = 5;
mynumbers.push_back(&somenumber);

for(int i=0;i<elemnts.size();i++)
{
    cout << "Element Nr. " << i << ": " << *elements.at(i) << endl;
    //modify like this:
    *elements.at(i) = 0;
}

変数自体の代わりにポインターを使用するのは、std::vector が大きなオブジェクト自体よりも高速にポインターを処理するためですが、int の場合、これは実際には大きな違いがないため、次のようにすることもできます。

std::vector<int> mynumbers;
mynumbers.push_back(5);

int* pointy
for(int i=0;i<elemnts.size();i++)
{
    pointy = &elements.at(i);
}

私にとってはうまくいきます!

于 2013-06-02T12:39:13.377 に答える
0

これが安全かどうかは、あなたが何を求めているかによって異なります。pointy は、ベクトル内の要素へのポインターになります。これは、pointy の値を変更するか、より具体的に何を指すかを変更すると、実際にはその特定の要素のベクトルの内容が変更されることを意味します。

于 2013-06-02T12:01:46.847 に答える