Преобразовать char** (c) неизвестной длины в вектор‹string› (c++)

Как можно было бы преобразовать C char** в вектор C++? Есть ли какие-то встроенные функции, которые можно использовать для этого, или лучше выполнить это с помощью серии итерационных шагов?

EDIT: по разным причинам количество элементов в массиве C неизвестно. Возможно, я мог бы передать это как еще один параметр, но так ли это необходимо?


person MirroredFate    schedule 29.03.2013    source источник
comment
Также см. копирование массива строк c в вектор std::string   -  person LihO    schedule 29.03.2013
comment
И С++ копирует массив строк в vector<string>   -  person LihO    schedule 29.03.2013
comment
Ух ты! Это очень похоже. Однако все они предполагают, что количество элементов известно.   -  person MirroredFate    schedule 29.03.2013
comment
Конечно, они предполагают, что размер массива (который у вас есть в виде простого указателя) известен. Как еще вы хотите узнать, сколько строк хранится в вашем char**?   -  person LihO    schedule 29.03.2013
comment
Я надеялся, что существует какой-то способ выяснить это. Поскольку вездесущее предположение заключалось в том, что такого метода не существует, я полагаю, что на самом деле нет способа определить количество элементов, только что заданных char **...   -  person MirroredFate    schedule 29.03.2013
comment
@MirroredFate: действительно нет способа. Если ваш массив не заканчивается сигнальным значением (например, нулевым указателем).   -  person Oliver Charlesworth    schedule 29.03.2013


Ответы (4)


Вы можете просто использовать конструктор std::vector, который принимает два итератора:

const char* arr[] = {"Hello", "Friend", "Monkey", "Face"};
std::vector<std::string> v(std::begin(arr), std::end(arr));

Или, если у вас действительно есть const char**:

const char** p = arr;
std::vector<std::string> v(p, p + 4);

Что также будет работать с прямым использованием arr вместо p из-за преобразования массива в указатель.

person Joseph Mansfield    schedule 29.03.2013
comment
@LihO Упс. Спасибо! - person Joseph Mansfield; 29.03.2013

char** c;
vector<string> v(c, c + 10);

Будет создавать элементы из элемента заданного диапазона. 10 - количество элементов здесь

person RiaD    schedule 29.03.2013
comment
Предположение здесь и со всеми ответами состоит в том, что количество элементов известно... - person MirroredFate; 29.03.2013
comment
@MirroredFate, вы всегда должны знать количество элементов в массиве в стиле c (или указатель указывает на последовательные элементы). В другом случае вы ничего не можете сделать (кроме удаления, если вы знаете, что оно было новым, и освобождения, если оно было распределено) - person RiaD; 29.03.2013

Вы можете использовать конструктор std::vector, который принимает два итератора, иначе конструктор диапазона:

char* strings[] = {"aaa", "bbb", "ccc", "ddd"};
std::vector<std::string> v(strings, strings + 4);

где 4 - размер вашего массива. В этом конкретном примере вычисление размера массива strings также возможно с помощью sizeof оператор:

int len = sizeof(strings)/sizeof(char*);
std::vector<std::string> v2(strings, strings + len);

что было бы невозможно с чистым char**, хотя, поскольку размер массива никаким образом не может быть напрямую получен из указателя (также стоит прочитать что-нибудь о распад массива).

person LihO    schedule 29.03.2013

Этот однострочный код полезен для захвата аргументов командной строки...

int
main(int argc, char ** argv)
{
  std::vector<std::string> arguments(argv, argv + argc);
}
person emsr    schedule 29.03.2013