0

ソート後にインデックスと番号を確認できるように、番号とインデックスで構成される構造体をソートする必要があります。私の構造体は次のとおりです。

    struct data{
     float   number;
      size_t index;
      };

    //My sorting function is:
     bool by_number( const data& left, const data& right)
               {
               return (left.number < right.number);
    }

   // My code to sort is:
    std::vector<data>dist_sort;
    dist_sort.reserve(5);
    dist_sort[0].number=33;
    dist_sort[1].number=36;
    dist_sort[2].number=12;
    dist_sort[3].number=103;
    dist_sort[4].number=233;

    dist_sort[0].index=1;
    dist_sort[1].index=2;
    dist_sort[2].index=3;
    dist_sort[3].index=4;
    dist_sort[4].index=5;

    std::sort(dist_sort.begin(),dist_sort.end(),by_number);

    cout<<dist_sort[0].number<<endl;
    cout<<dist_sort[0].index<<endl;

出力は 12 と 3 になると思いますが、取得できません。コードがコンパイルされ、関連するすべてのヘッダーがインクルードされました。私を助けてください!私は何が欠けていますか?

4

2 に答える 2

1
dist_sort.reserve(5);

十分なスペースを確保しますが、要素は実際には構築されません。これは間違っています。

resize代わりに必要です。またはpush_back、 の代わりに , を使用しoperator[]ます。

于 2012-09-28T05:50:37.850 に答える
1

使い方がstd::vector間違っています。reserve追加の挿入のためにメモリを予約するだけで、ベクトルに含まれる実際の要素の数は変更されません (つまり、size()レポートの内容は変更されません)。

したがって、サイズ 0 のベクトルを に渡しているためstd::sort()、結果として何もしません。

reserve(5)に置き換えるかresize(5)、要素の割り当てを への呼び出しに置き換えますpush_back()

使用する唯一の理由reserve()は、多数の要素を挿入するときに再割り当て (したがってコピー) を避けるためです。std::vector要素をメモリの連続ブロックに格納するため、新しく挿入された要素が以前に割り当てられたブロックに収まらない場合は、すべての要素をコピーする必要があります。std::vector通常、それが発生するたびにメモリ領域の割り当てサイズが 2 倍になり、挿入の平均コストが O(n) に低下します (O(n^2) から、挿入ごとにコピーが発生した場合)。しかし、そのすべてのコピーのコストは依然としてかなりのものになる可能性があります。たとえば、以前は空のstd::vector. その場合、事前に目的のサイズのメモリ ブロックを割り当てます。reserve()、および個々の挿入は、要素を保存してベクトルサイズをインクリメントするだけで済みます。ただしreserve()、観測可能な状態を変更することはなく、ベクトルの内部の目に見えない状態のみを変更します。

于 2012-09-28T06:03:56.367 に答える