0
#include<iostream>
using namespace std;
#include<vector>
#include "s.h"


template<class T> 
void f(vector<T> a)
{
    cout << "size  " << a.size() << endl;
    cout << "capacity  " << a.capacity() << endl << endl;
}


int main()
{
    vector<int> s(10,5);
    f(s);
    s.resize(50);
    f(s);
    s.reserve(150);
    f(s);
    return 0;
}

resize() はサイズを変更し、reserve() は容量を変更すると思いますが、私の例では reserve() が容量を変更しないのはなぜですか? 2 つ目の質問ですが、assign() の意味は何ですか? operator=() でも同じことができますか?

// 10 10
// 50 50 
// 50 50
4

4 に答える 4

6

ベクトルを関数に渡すと、ベクトルのコピーが作成されます。fベクトルを参照渡しするようにの定義を変更すると、期待どおりに動作することがわかります。

void f(const vector<T>& a)

版画

size  10
capacity  10

size  50
capacity  50

size  50
capacity  150
于 2013-03-26T07:26:47.900 に答える
4

ベクトルをコピーすると、その内容がコピーされます。また、容量はベクターのコンテンツの一部とは見なされません。関数はそのパラメーターをコピーするためf、実際のベクターを渡しません。あなたはコピーを渡しています。容量が実装定義の値に設定されているコピー。

于 2013-03-26T07:29:20.083 に答える
3

への呼び出しreserve(...)は実際には機能しているかもしれませんが、あなたはそれを知らないだけです。関数を呼び出すとき

void f(vector<T> a)

元のベクトルを新しいベクトルにコピーaています。その時点で、ライブラリが最小限の容量でベクトルを作成すると思われます。関数のシグネチャを次のように変更しようとすると、

void f(vector<T> const& a)

関数はコピーではなく元のベクトル オブジェクトで動作するため、期待どおりの結果が得られる場合があります。

于 2013-03-26T07:28:40.163 に答える
1

reserve() は常に容量を増やしますが、 resize() はデータの破壊や何らかの危険を含む何でもできます。実際のサイズよりも小さい容量で reserve() を呼び出しても問題や変更は発生しない可能性がありますが、サイズよりも小さい値で resize() を呼び出すと、単にデータがトリミングされるか、実際のサイズよりも大きい値でサイズ変更すると、もちろんベクター サイズ自体が増加します。

于 2013-03-26T08:30:39.993 に答える