0

次のコード スニペットがあります。

struct compare {
    bool operator()(const pair<size_t, double>& left, const pair<size_t, double>& right) {
               return left.second > right.second;
    }
};

int main() {
   size_t vertices = 31112738;
   vector<pair<size_t, double> > opt, one;
   opt.reserve(vertices);
   one.reserve(vertices);

   for(size_t i=0;i<vertices;i++) {
      opt[i] = make_pair(i,rand());
      one[i] = make_pair(i,rand()); 
   }

   sort(opt.begin(), opt.end(), compare());
   sort(one.begin(), one.end(), compare());

  return 0;


}

sort 関数を呼び出しても、opt[] と one[] はソートされません。ただし、push_back() を使用して要素を挿入してから sort() 関数を呼び出すと、要素が並べ替えられます。

2 つのシナリオで結果が異なるのはなぜですか?

4

1 に答える 1

2

概説したシナリオでは、ベクトルのサイズは常に 0 であるためです。

ベクター内により多くのスペースを確保しますが、サイズ変更することはありません。(したがって、for ループは、ベクトルの末尾を超えて書き込むことにより、未定義の動作をトリガーするだけです)

push_backベクトルのサイズを 1 増やしますが、それを呼び出さない場合はresize、サイズを明示的に呼び出して設定する必要があります。(またはコンストラクタの引数としてサイズを指定)

于 2013-10-02T07:06:14.267 に答える