2

ベクトルを使用してコーディングを開始し、次の基本的なコードを作成しました。

#include<iostream>
#include<vector>

using namespace std;

int main(){
    vector<int> second(4,100);

    cout<<second[0]<<endl; 
    cout<<second[1]<<endl; 
    cout<<second[2]<<endl; 
    cout<<second[3]<<endl; 
    cout<<second[4]<<endl; 
    cout<<second[5]<<endl; 
    cout<<second[6]<<endl; 
    cout<<second[7]<<endl; 

    return 0;
}

私が得る出力は次のとおりです

100
100
100
100
0
135145
0
0

RUN FINISHED; exit value 0; real time: 10ms; user: 0ms; system: 0ms

cout<<second[5]の出力が3 より大きい残りのインデックスと異なるのはなぜですか。

4

4 に答える 4

6
vector<int> second(4,100);

最初の引数はコンストラクターにベクターのサイズを伝え、2 番目の引数はそれを埋めるために使用する値を伝えます。

サイズ 4 のベクトルを作成しました。これは、最後の有効な要素が であることを意味しますsecond[3]。それを超えるものは、ベクトルに属さないメモリとの間で境界外で書き込みまたは読み取りを行い、未定義の動作を引き起こします。

メソッドを使用push_backして、最後に要素を安全に追加できます。

于 2013-08-13T14:46:13.367 に答える
2

100 で初期化される 4 つの要素を持つベクトルを作成します。その時点で、次のようになります。

cout<<second[4]<<endl; 

境界を超えてしまうと、未定義の動作になります。

于 2013-08-13T14:46:59.480 に答える
1

使用しているのstd::vectorコンストラクターは、count と value の 2 つの引数を受け入れます。あなたの場合、4 つの要素のベクトルを作成しています。ただし、8 つの要素にアクセスしようとしています。これにより、未定義の動作がトリガーされます。

興味深い事実の 1 つは、whileoperator[](size_type)は有効な範囲をチェックせず、UB をトリガーできるようにすることです。std::vector::at()メソッドはチェックし、インデックスが範囲外の場合は例外をスローします。

于 2013-08-13T14:46:54.113 に答える
0

ベクトルの最初の 4 つの要素のみを初期化しています。残りは初期化されていないランダムなメモリです。

于 2013-08-13T14:47:02.463 に答える