C のベクトル サイズを理解する : Size() - 1 が驚くべき結果をもたらす理由
C では、ベクトル クラスが強力なメカニズムを提供します動的配列の管理用。ただし、特に空のベクトルを扱う場合には、size() 関数の微妙な点を理解することが重要です。
次のコード スニペットを考えてみましょう。
#include <vector> #include <iostream> using namespace std; int main() { vector<int> value; cout << value.size() << endl; // output 0 cout << value.size() - 1 << endl; // output 18446744073709551615 }
最初の cout ステートメントは正しく出力します。 0 (空のベクトルを示す) の場合、2 番目のステートメントは予期せぬ大きな数値 18446744073709551615 を生成します。これは何が原因でしょうか。予期しない動作ですか?
符号なし整数表現
この問題を理解する鍵は、size_t 型の性質にあります。 size() は、符号なし整数型のベクトルのサイズを返します。符号なし整数は、負でない値を表すために使用されます。つまり、負の数を格納できません。
オーバーフローと値の不正表現
size() 関数が空のベクトルの場合、0 を返します。0 から 1 を減算すると、符号なし size_t 値がオーバーフローします。結果は、size_t で表現できる最大値 18446744073709551615 までラップアラウンドします。
プログラミングへの影響
この動作は、ベクトルを操作するときに微妙なバグを引き起こす可能性があります。 。たとえば、ベクトルが空の場合に size() - 1 が常に -1 を返すと仮定するのは安全ではありません。この問題は、for ループを使用して空のベクトルを反復処理する場合に特に関係します。
このような問題を回避するには、size() を慎重に使用し、その値から 1 を減算するときのロジックを慎重に検討することをお勧めします。必要に応じて、空のベクトルを明示的にチェックするなどの代替方法を使用して、正しい機能を確保する必要があります。
以上がC で空ベクトルに対して `vector.size() - 1` が -1 ではなく大きな数値を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。