我想初始化一个带有以下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));
并且它适用于此类型,但对于字符串类型,它不起作用。
答案 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,您可以直接使用初始化列表。