c ++ vector <string>错误C2664 </string>

时间:2012-09-21 17:49:16

标签: c++ string vector

我遇到了字符串数组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;

我不知道什么是错的。

4 个答案:

答案 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")的构造函数。