14
void PrintNow(const std::vector<int> &v)
{
    std::cout << v[0] << std::endl;
}

std::vector<int>().push_back(20); // this line generates no complains
PrintNow(std::vector<int>().push_back(20)); // error

VS2010 Sp1から:

eror C2664:'PrintNow':パラメータ1を'void'から'const std :: vector <_Ty>&'に変換できません

Q>一時的なベクトルを関数に渡すことは可能ですか?

4

5 に答える 5

19

C ++ 11では、次のことができます。

void PrintNow(const std::vector<int> &v)
{
    std::cout << v[0] << std::endl;
}

PrintNow({20});

ただし、VS2010はC++11のこの部分をまだサポートしていません。(gcc4.4とclang3.1はそうです)

単一の要素のみが必要な場合は、C++03で次のことができます。

PrintNow(std::vector<int>(1,20));

複数の要素が必要な場合は、1行の解決策はないと思います。あなたはこれを行うことができます:

{ // introduce scope to limit array lifetime
    int arr[] = {20,1,2,3};
    PrintNow(std::vector<int>(arr,arr+sizeof(arr)/sizeof(*arr));
}

または、intのリストを受け取り、ベクトルを返すvarargs関数を作成することもできます。価値があるかどうかはわかりませんが、これをよく使わない限り。

于 2012-04-19T14:48:01.087 に答える
6

問題は、関数に一時を渡すことができないということではなく、をstd::vector::push_back()返すことです。void

于 2012-04-19T14:42:50.973 に答える
5

std::vector::push_back関数の戻りタイプが次のとおりであるため、エラーが生成されますvoid

void push_back ( const T& x );

次のことを試してください。

PrintNow(std::vector<int>(1, 20));

上記のコードは、std::vectorクラスで使用可能なコンストラクターの1つを使用しています。

explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
于 2012-04-19T14:46:13.407 に答える
5

はい、できます。

points.push_back(vector<int>{1, 2, 3, ....});

配列のようにベクトルを初期化していて、名前を付けていません。単一または複数の要素の場合は非常に簡単です。

于 2020-03-12T09:05:28.423 に答える
4

すべての要素が同じ値である場合、ニーズに合ったコンストラクターが1つあります。

PrintNow(std::vector<int>(1,20));
于 2012-04-19T14:45:16.727 に答える