Преобразование строкового массива в вектор строкового типа - PullRequest
1 голос
/ 21 января 2012

Я хочу инициализировать вектор со следующими данными 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 ]

5 голосов
/ 21 января 2012

Ваш массив не имеет смысла. Должно быть:

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"
};
0 голосов
/ 21 января 2012

Тип arr на самом деле не string, а char[6][8] (странно, что это компилируется, потому что вы инициализируете члены этого массива с char[9] объектами: строковые литералы включают завершающий '\ 0' персонаж). Чтобы правильно получить размер массивов статического размера, я всегда рекомендую , а не , чтобы использовать этот хак с использованием sizeof(). Вместо этого используйте такой шаблон функции (на самом деле, я просто включил шаблон 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 вы можете напрямую использовать списки инициализаторов.

...