0
#include <iostream>
#include <vector>

int main()
{
    std::vector<double> test1(1);

    test1[100] = 5.;

    std::vector< std::vector <double > > test2(1, std::vector<double>(1,0));

    test2[50][100] = 5.;
}

test1:メモリのサイズ変更と割り当てを適切に行う

test2"Segmentation fault (core dumped)"。なんで?

:行サイズが等しくないため、マトリックスは使用できません。

概要:: at(int)境界をチェックし、必要に応じて例外をスローします-サイズ変更なし

operator[](int):境界をチェックしません-サイズ変更なし

push_back()capacity():現在の容量が小さい場合、サイズ変更は2倍になります

size():の要素数vector

capacity():再割り当てが必要になる前に保持する最大要素

4

4 に答える 4

3

サイズ1のベクトルのインデックス100の要素にアクセスします。ベクトルの境界外のインデックスにアクセスしないでください。真実は、2番目が機能しないという奇妙なことではなく、最初のケースで機能するのは純粋な運です。

resize()ベクトルはまたはへの呼び出しで拡張されますpush_backが、インデックスにアクセスするだけではベクトルのサイズは拡張されません。代わりに、未定義の動作を引き起こします。

コードを修正するには、次のようにします(ベクトルを作成するときに使用するサイズを変更します)。

#include <iostream>
#include <vector>

int main()
{
    std::vector<double> test1(101);

    test1[100] = 5.;

    std::vector< std::vector <double > > test2(51, std::vector<double>(101,0));

    test2[50][100] = 5.;
}
于 2013-01-30T10:25:35.327 に答える
1

各ベクトルの境界の外側にアクセスしています。

std::vector<double> test1(1); // size 1 vector
test1[100] = 5.; // out of bounds access

結果は未定義の動作です。サイズ100のベクトルを作成する場合は、次のようにします。

std::vector<double> test1(101); // size 101 vector
test1[100] = 5.; // OK, access 101th element
test.push_back(42); // push element, size is now 102
于 2013-01-30T10:25:21.067 に答える
1

test1:メモリのサイズ変更と割り当てを適切に行う

std :: vectorは、 std :: vector :: push_backを呼び出すとサイズ変更されてメモリが割り当てられますが、ランダムアクセス演算子ではランダムではありません。

test2: "セグメンテーション違反(コアダンプ)"。なんで?

以下のコードは、test1、test2の境界外にアクセスします。

test1[100] = 5.0;
test2[50][100] = 5.0;

アクセスする前にベクトルサイズをテストできます

if (test1.size() > 100))
{
    test1[100] = 5.0;
}  

または、try/catchブロックでstd::vector::at関数を使用できます。

try
{
    test2.at(50).at(100) = 5.0;
}
catch(const std::exception& e)
{
   std::cout << e.what() << std::endl;
}    
于 2013-01-30T10:30:27.097 に答える
0

operator []を自動的に展開/挿入する場合は、std :: map:を使用します。

#include <iostream>
#include <map>

int main()
{
    std::map<double> test1;

    test1[100] = 5.; // Will insert one element into test1

    std::map< std::map <double > > test2;

    test2[50][100] = 5.; // will create a new map<double> and insert one element into it.
}
于 2013-01-30T11:32:14.167 に答える