-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 从 'const char' 转换为 'const std:: basic_string<_Elem,_Traits,_Ax> &'

我不明白出了什么问题。

4

4 回答 4

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]);

您最终会将数组中的项目复制到向量中以对其进行初始化,因为您使用了带有两个迭代器的构造函数,其中的指针是随机访问的。

于 2012-09-21T17:55:31.007 回答
2

for 的构造函数vector不采用项目列表,它采用单个项目和一个计数。

于 2012-09-21T17:55:39.330 回答
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"

于 2012-09-21T18:03:22.837 回答
0

the first parameter of the constructors of vector is the number of elements, and the second is the value of these elements.

vector<int>a (1,2) means 1 element which value is 2, but there's no constructors of vector matching vector<string> a("one","two").

于 2012-09-23T18:16:34.403 回答