2013-12-18 3 views
9

У меня есть строка, которая содержит некоторое количество целых чисел, которые ограничены пробелами. Напримерparse string к вектору int

string myString = "10 15 20 23"; 

Я хочу преобразовать его в вектор целых чисел. Таким образом, в этом примере вектор должен быть равен

vector<int> myNumbers = {10, 15, 20, 23}; 

Как это сделать? Извините за глупый вопрос.

+0

Использование 'повышение :: split_regex' – Blacktempel

+0

@juanchopanza Не могли бы вы любезно объяснить, как разбиение на строки ** * * считается таким же, как расщепление на *** вектор int ***? –

+0

@jrok Существуют значительные различия между простое разделение строки и разделение строки при одновременном преобразовании типа. –

ответ

17

Вы можете использовать std::stringstream. Вам нужно будет #include <sstream> кроме других.

#include <sstream> 
#include <vector> 
#include <string> 

std::string myString = "10 15 20 23"; 
std::stringstream iss(myString); 

int number; 
std::vector<int> myNumbers; 
while (iss >> number) 
    myNumbers.push_back(number); 
+0

Я думаю, что добавление операторов включения сделает этот ответ еще лучше. – Wolf

+0

@ Вольф Да спасибо за указание. Добавлен. –

+0

Я имею в виду все (+ вектор), а также [используя декларации] (http://en.cppreference.com/w/cpp/language/using_declaration), необходимые для его компиляции. Я буду поддерживать свой (+1) :) – Wolf

0

Это почти дубликат другого ответа.

#include <iostream> 
#include <vector> 
#include <iterator> 
#include <sstream> 

int main(int argc, char* argv[]) { 
    std::string s = "1 2 3 4 5"; 
    std::istringstream iss(s); 
    std::vector<int> v{std::istream_iterator<int>(iss), 
         std::istream_iterator<int>()}; 
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")); 
} 
+0

Не нужно использовать 'std :: copy'. Потому что 'std :: vector' имеет конструктор, который принимает два итератора (точно так же, как std :: copy). –

+1

Кроме того, * хороший старый для цикла * для вывода лучше не включать сюда, потому что это нелегко *. – Wolf

5
std::string myString = "10 15 20 23"; 
std::istringstream is(myString); 
std::vector<int> myNumbers(std::istream_iterator<int>(is), std::istream_iterator<int>()); 

Или вместо последней строки, если вектор был уже определен, то

+2

Правильнее было бы написать последнюю строку как std :: vector myNumbers ((std :: istream_iterator (is)), std :: istream_iterator ()); то есть заключить первый аргумент в круглые скобки. В противном случае вместо векторного определения это будет объявление функции. :) –

+2

Или вы можете использовать конструкцию списка инициализаций, которая предназначена для решения этой проблемы. 'std :: vector myNumbers {std :: istream_iterator (is), std :: istream_iterator ()};' –

Смежные вопросы