С++: Элегантный способ разделить содержимое строки и содержимого на std::vector

Я хотел бы разделить строку вдоль пробелов, и я знаю, что токены представляют действительные целые числа. Я хотел бы преобразовать токены в целые числа и заполнить вектор с ними.

Я мог бы использовать boost:: split, создать вектор токенов, затем использовать std:: transform.

Каково ваше решение? Использование boost является приемлемым.

Ответ 1

Что-то вроде этого:

std::istringstream iss("42 4711 ");
std::vector<int> results( std::istream_iterator<int>(iss)
                        , std::istream_iterator<int>() );

?

Ответ 2

Вы можете использовать Boost.Tokenizer. Его можно легко обернуть в функцию explode_string, которая берет строку и разделитель и возвращает вектор токенов.

Использование transform для возвращаемого вектора - хорошая идея для преобразования из строк в int; вы также можете просто передать итератор Boost.Tokenizer в алгоритм transform.

Ответ 3

Используйте библиотеку алгоритмов Boost string для split строки в вектор строк, затем std::for_each и либо atoi, либо boost::lexical_cast, чтобы превратить их в int s. Скорее всего, это намного проще, чем другие методы, но не может иметь наибольшую производительность из-за копии (если у кого-то есть способ улучшить его и удалить, прокомментируйте).

std::vector<int> numbers;

void append(std::string part)
{
    numbers.push_back(boost::lexical_cast<int>(part));
}

std::string line = "42 4711"; // borrowed from sbi answer
std::vector<std::string> parts;
split(parts, line, is_any_of(" ,;"));
std::for_each(parts.being(), parts.end(), append);

Грубо.

http://www.boost.org/doc/libs/1_44_0/doc/html/string_algo.html http://www.boost.org/doc/libs/1_44_0/libs/conversion/lexical_cast.htm

Ответ 4

Вы всегда можете использовать strtok или string.find().