3

std::arrayをいじって、 との違いを確認したかったのstd::vectorです。これまでのところ、大きな違いは 1 つしか見つかりませんでした。

Sentence sentence = { "Hello", "from", "GCC", __VERSION__, "!" };  
std::array<std::string, 10> a;
std::copy(sentence.begin(), sentence.end(), a.begin());

int i = 0;
for (const auto& e : a)
{
    i++;
    std::cout << e << std::endl;
}
std::cout << i << std::endl;

// outputs 10

i = 0;
for (const auto& e : sentence)
{
    i++;
    std::cout << e << std::endl;
}
std::cout << i << std::endl;

// outputs 5

for (int i = 0; i < a.size(); i++)
    std::cout << i << " " << a[i] << std::endl;

// outputs 0 Hello
// ...
//         4 !
//         5-9 is blank

for (int i = 0; i < sentence.size(); i++)
    std::cout << i << " " << sentence[i] << std::endl;

// outputs 0 Hello
// ...
//         4 !
// stops here


// The following outputs the same as above
i = 0;

for (auto it = a.begin(); it != a.end(); it++)
{
    std::cout << i << " " << *it << std::endl;
    i++;
}
std::cout << i << std::endl;
i = 0;
for (auto it = sentence.begin(); it != sentence.end(); it++)
{
    std::cout << i << " " << *it << std::endl;   
    i++;
}
std::cout << i << std::endl;

私が見る限り、とは冗長ですが、std::arrayとは同じでも異なっていてもかまいません。これは、この引用からも確認されます。sizemax_sizestd::vectorsizecapacity

配列オブジェクトの size と max_size は常に一致します。

では、なぜstd::array冗長なサイズ関数があるのでしょうか? さらに重要なことに、ベクトルには容量があるため、 のstd::arrayサイズが のサイズと必ずしも同じではないという落とし穴を考えますか? std::vectorまた、これはstd::arrays が安全であることを意味しますか (つまり、ベクトルのようなスマート ポインター管理がありますか?)

4

5 に答える 5

3

capacityin vectorは .. の最大容量であり、vectorその と同じである場合と異なる場合がありますsizesizeの現在の要素数ですvector

パフォーマンス上の理由から、ベクトルの最大サイズが事前にわかっている (または推測している) 場合は、(デフォルト値を使用するのではなく) ベクトルの容量を事前に決定できます。これにより、繰り返しごとに (要素を追加するときに) 再割り当てする必要がないため、コードのパフォーマンスが大幅に向上する可能性があります。

http://www.cplusplus.com/reference/vector/vector/capacity/

于 2013-05-05T02:25:29.013 に答える
1

少し拡張すると、配列の最大サイズが配列のサイズであるstd::arrayなど、配列の実際の設計に非常によく似ています。char[]これは、配列が不変のサイズを持つと考えることができるためです。これは、メモリを完全に再割り当てする以外に変更できないサイズです。および 0 からその までの任意のサイズstd::vectorに設定できるとは異なり、ただし、その値が渡されると、新しい要素ごとに、 内の基礎となる配列が完全に再作成され、割り当てられます。capacitycapacitycapacityvector

于 2013-05-05T02:28:19.663 に答える
1

ご指摘のとおり、 astd::arrayは常に同じサイズです。size() == capacity(). つまり、 を作成すると、のデフォルト コンストラクタstd::array<T, 5>が 5 回呼び出されます。T一方、 Astd::vector<T>は、要素をデフォルトで構築しません。ベクトルを呼び出しreserve(5)ても、アイテムは作成されません。

少なくとも私がそれらについて考える方法では、「スマートポインター管理」std::arrayもありません。std::vectorどちらもイテレータ型を提供し、begin/end/rbegin/rendそのような関数を使用してコンテナ内の要素をトラバースできます。人々が「スマート ポインター」と言うとき、私は を思い浮かべますshared_ptr/unique_ptr/auto_ptr/etc

一般に、astd::arrayはスタックに格納され、a はstd::vectorヒープにストレージを割り当てます。パフォーマンスが重要なアプリケーションでは、これは にとって大きな利点ですstd::array。ヒープにメモリを割り当てると、特にマルチスレッド アプリケーションでは、スタックを使用するよりも数百倍または数千倍遅くなる可能性があります。

于 2013-05-07T18:02:38.937 に答える