将字符串数组转换为字符串类型的向量

时间:2012-01-21 18:15:15

标签: c++ arrays vector multidimensional-array initialization

我想初始化一个带有以下arr数据的向量,因为我必须初始化一个字符串类型数组并将其值复制到向量字符串 这就是我在做的事情

它会带来很多错误

string arr[6][8]={
"AAAAAAAA",
"ABWBWBWA",
"ABWBWBWA",
"ABWBWBWA",
"ABWBWBWA",
"AAAAAAAA"};
vector<string> v(arr,arr+sizeof(arr)/sizeof(string));   

我已经为int数组和int类型的向量做了。 像这样,

int vv[]={0,0,0,8};
vector<int> v(vv,vv+sizeof(vv)/sizeof(int));        

并且它适用于此类型,但对于字符串类型,它不起作用。

2 个答案:

答案 0 :(得分:5)

你的阵列毫无意义。它应该是:

std::string arr[] = {
  "AAAAAAAA",
  "ABWBWBWA",
  "ABWBWBWA",
  "ABWBWBWA",
  "ABWBWBWA",
  "AAAAAAAA" };

然后

std::vector<std::string> v(arr, arr + sizeof(arr) / sizeof(std::string));

应该按预期工作。

或者,您可以修复6并说出v(arr, arr + 6);

然而,在现代C ++中,你只会说,

std::vector<std::string> v {
  "AAAAAAAA",
  "ABWBWBWA",
  "ABWBWBWA",
  "ABWBWBWA",
  "ABWBWBWA",
  "AAAAAAAA"
};

答案 1 :(得分:0)

arr的类型实际上不是string而是char[6][8](这是编译的奇怪,因为您使用char[9]对象初始化此数组的成员:字符串文字包括终止'\ 0'字符)。为了正确地获得静态大小数组的大小,我总是建议使用这个使用sizeof()的C hack。相反,使用这样的函数模板(实际上,我只是包含size()模板,因为您使用了大小;使用begin()end()来获取迭代器是优越的:

template <typename T, int Size> int size(T (&array)[Size]) { return Size; }
template <typename T, int Size> T* begin(T (&array)[Size]) { return array; }
template <typename T, int Size> T* end(T (&array)[Size])   { return array + Size; }
...
std::vector<std::string> v(begin(arr), end(arr));

在C ++ 2011中,begin()end()函数是标准C ++库的一部分。当然,使用C ++ 2011,您可以直接使用初始化列表。