-1

文字列配列C++配列サイズの異なる結果に問題がありました。配列の代わりにベクトルを使用するようにアドバイスを受けました。しかし、これは機能します:

#include "stdafx.h"
#include <string>
#include <iostream>
#include <vector>

using namespace std;

vector<int> a (1,2);

void test(vector<int> a)
{
    cout << a.size(); 
}
int _tmain(int argc, _TCHAR* argv[])
{
     test(a);

    return 0;
}

しかし、これはしません:

vector<string> a ("one", "two");

void test(vector<string> a)
{
    cout << a.size(); 
}
int _tmain(int argc, _TCHAR* argv[])
{
     test(a);

    return 0;
}

エラーC2664: 'std :: basic_string <_Elem、_Traits、_Ax> :: basic_string(const std :: basic_string <_Elem、_Traits、_Ax>&)':パラメータ1を'constchar'から'const std::に変換できませんbasic_string <_Elem、_Traits、_Ax>& '

何がうまくいかない。

4

4 に答える 4

2

(N, X)1つ目は、それぞれがXの値を持つN個の要素を作成するコンストラクターを呼び出すことです。したがって、最終的に1つの2になります。

const char *2つまたは同様のものを使用しないため、2番目のコンストラクターに一致するものはありません。

初期化子リストに一致するものがあるため(少なくともC ++ 11では)、代わりにカーリーを使用してください。

std::vector<int> v{1, 2}; //contains a 1 and a 2
std::vector<std::string> v2{"hi", "bye"}; //contains "hi" and "bye"

C ++ 03では、代わりにこれを行うことができます。

int vecInit[] = {1, 2, 3, 4};
std::vector<int> vec(vecInit, vecInit + sizeof vecInit / sizeof vecInit[0]);

ポインタがランダムアクセスである2つのイテレータを使用するコンストラクタを利用するため、配列からベクトルに項目をコピーして初期化することになります。

于 2012-09-21T17:55:31.007 に答える
2

のコンストラクターvectorはアイテムのリストを取得せず、単一のアイテムとカウントを取得します。

于 2012-09-21T17:55:39.330 に答える
1

std::vectorいくつかのコンストラクタがあります。それらの1つは、最初のパラメーターとして要素の数を想定し、2番目のパラメーターとして要素の値を想定しています。

vector<int> a (1,2)ベクトルaを、値が2の1つの要素で初期化した場合。

vector<string> a ("one", "two");コンパイラーが最初のパラメーターをint(または他のコンストラクターの最初のパラメーターとして期待される他のタイプ)に変換できない場合。

回避策として、次のようなことを試すことができます。

std::string ch[] = {"one", "two"};
std::vector<std::string> a (ch, ch + _countof(ch));

これは2つの文字列で埋めaられます:"one""two"

于 2012-09-21T18:03:22.837 に答える
0

vectorのコンストラクターの最初のパラメーターは要素の数であり、2番目のパラメーターはこれらの要素の値です。

vector<int>a (1,2)値が2である1つの要素を意味しますが、ベクトルマッチングのコンストラクターはありませんvector<string> a("one","two")

于 2012-09-23T18:16:34.403 に答える