Ответ 1
Что-то вроде этого:
std::istringstream iss("42 4711 ");
std::vector<int> results( std::istream_iterator<int>(iss)
, std::istream_iterator<int>() );
?
Я хотел бы разделить строку вдоль пробелов, и я знаю, что токены представляют действительные целые числа. Я хотел бы преобразовать токены в целые числа и заполнить вектор с ними.
Я мог бы использовать boost:: split, создать вектор токенов, затем использовать std:: transform.
Каково ваше решение? Использование boost является приемлемым.
Что-то вроде этого:
std::istringstream iss("42 4711 ");
std::vector<int> results( std::istream_iterator<int>(iss)
, std::istream_iterator<int>() );
?
Вы можете использовать Boost.Tokenizer. Его можно легко обернуть в функцию explode_string
, которая берет строку и разделитель и возвращает вектор токенов.
Использование transform
для возвращаемого вектора - хорошая идея для преобразования из строк в int; вы также можете просто передать итератор Boost.Tokenizer в алгоритм transform
.
Используйте библиотеку алгоритмов 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
Вы всегда можете использовать strtok или string.find().