我遇到了字符串数组C++ array size different result的问题我得到了使用向量而不是数组的建议。但这有效:
#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:&#39; std :: basic_string&lt; _Elem,_Traits,_Ax&gt; :: basic_string(const std :: basic_string&lt; _Elem,_Traits,_Ax&gt;&amp;)&#39 ; :无法从&#39; const char&#39;转换参数1 to&#39; const std :: basic_string&lt; _Elem,_Traits,_Ax&gt; &安培;&#39;
我不知道什么是错的。
答案 0 :(得分:2)
第一个是调用一个构造函数(N, X)
来创建N个元素,每个元素的值为X,所以最终得到一个2。
第二个构造函数没有匹配,因为没有匹配const char *
或类似的。
使用curlies代替,因为初始化列表匹配(至少在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]);
您最终会将数组中的项目复制到向量中以初始化它,因为您使用了带有两个迭代器的构造函数,其中的指针是随机访问的。
答案 1 :(得分:2)
vector
的构造函数不会获取项目列表,只需要一个项目和一个计数。
答案 2 :(得分:1)
std::vector
有几个构造函数。其中一个期望元素的数量作为第一个参数,元素值作为第二个参数。
如果是vector<int> a (1,2)
,则使用1个元素初始化向量a,其值为2。
如果vector<string> a ("one", "two");
编译器无法将第一个参数转换为int(或预期作为其他构造函数的第一个参数的任何其他类型)。
作为一种解决方法,您可以尝试以下方法:
std::string ch[] = {"one", "two"};
std::vector<std::string> a (ch, ch + _countof(ch));
这会将a
填入两个字符串:"one"
和"two"
答案 3 :(得分:0)
vector的构造函数的第一个参数是元素的数量,第二个是这些元素的值。
vector<int>a (1,2)
表示1个元素,其值为2,但没有矢量匹配vector<string> a("one","two")
的构造函数。