2012-04-29 3 views
1

Предположим, у меня есть строка цифрРазобрать строку пробелами в вектор

"1 2 3 4 5 6" 

Я хочу разделить эту строку и поместить каждое число в другой слот в моем векторе. Что такое лучший способ пойти об этом

+2

Stringstreams и 'getline' хорошо работать для этого. – chris

+3

std :: stringstream mystringstream (mystring); std :: copy (std :: istream_iterator (mystringstream), std :: istream_iterator (), std :: back_inserter (myvector)); –

+0

[Как разбить строку на C++] (http://stackoverflow.com/questions/236129) – Blastfurnace

ответ

0
#include <iostream> 
#include <string> 
#include <algorithm> 
#include <cstdlib> 

std::vector<std::string> StringToVector(std::string const& str, char const delimiter); 

int main(){ 

    std::string str{"1 2  3 4 5 6 "}; 
    std::vector<std::string> vec{StringToVector(str, ' ')}; 


    //print the vector 
    for(std::string const& item : vec){ 
     std::cout << "[" << item << "]"; 
    } 


    return EXIT_SUCCESS; 
} 

std::vector<std::string> StringToVector(std::string const& str, char const delimiter){ 

    std::vector<std::string> vec; 
    std::string element; 


    //we are going to loop through each character of the string slowly building an element string. 
    //whenever we hit a delimiter, we will push the element into the vector, and clear it to get ready for the next element 
    for_each(begin(str),end(str),[&](char const ch){ 
     if(ch!=delimiter){ 
      element+=ch; 
     } 
     else{ 
      if (element.length()>0){ 
      vec.push_back(element); 
      element.clear(); 
      } 
     } 
    }); 


    //push in the last element if the string does not end with the delimiter 
    if (element.length()>0){ 
     vec.push_back(element); 
    } 


    return vec; 
} 

г ++ -std = C++ 0x -o главный main.cpp

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

3

Используйте istringstream для передачи строки в виде потока и оператора >>, чтобы принимать цифры. Он также будет работать, если строка содержит символы новой строки и вкладки. Вот пример:

#include <vector> 
#include <sstream> // for istringstream 
#include <iostream> // for cout 

using namespace std; // I like using vector instead of std::vector 

int main() 
{ 
    char *s = "1 2 3 4 5"; 
    istringstream s2(s); 
    vector<int> v; 
    int tmp; 

    while (s2 >> tmp) { 
    v.push_back(tmp); 
    } 

    // print the vector 
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { 
    cout << *it << endl; 
    } 

} 
+1

Вы можете улучшить этот цикл while. Измените 'while (s2)' на 'while (s2 >> tmp)', после чего вы также можете удалить разрыв внутри цикла. –

+0

@ Loki Astari - Спасибо, сделано. –

+0

Нет проблем. Примечание. Если вы просто печатаете вектор. Тогда вам действительно не нужно изменять доступ к членам. Поэтому, возможно, стоит использовать 'vector :: const_iterator' –

0
#include <vector> 
#include <string> 
#include <sstream> 
int str_to_int(const string& str){ 
    stringstream io; 
    int out; 
    io<<str; 
    io>>out; 
    return out; 
}; 

vector<int> Tokenize(string str, string delimiters = " ") 
{ 
    vector<int> tokens; 
    string::size_type nwpos; //position of first non white space, which means it is  first real char 
    nwpos = str.find_first_not_of(delimiters, 0); //ignore the whitespace before the first word 

    string::size_type pos = str.find_first_of(delimiters, nwpos); 

    while (string::npos != pos || string::npos != nwpos) 
    { 
     // Found a token, add it to the vector. 
     tokens.push_back(str_to_int(str.substr(nwpos, pos - nwpos))); 
     // Skip delimiters. Note the "not_of" 
     nwpos = str.find_first_not_of(delimiters, pos); 
     // Find next "non-delimiter" 
     pos = str.find_first_of(delimiters, nwpos); 
    } 
    return tokens; 
}; 
0

попробовать:

#include <sstream> 
#include <string> 
#include <algorithm> 
#include <iterator> 
#include <vector> 

int main() 
{ 
    // The data 
    std::string data = "1 2 3 4 5 6"; 

    // data in a stream (this could be a file) 
    std::stringstream datastream(data); 

    // Copy the data from the stream into a vector. 
    std::vector<int> vec; 
    std::copy(std::istream_iterator<int>(datastream), std::istream_iterator<int>(), 
       std::back_inserter(vec) 
      ); 


    // We can also copy the vector to the output (or any other stream). 
    std::copy(vec.begin(), vec.end(), 
       std::ostream_iterator<int>(std::cout, "\n") 
      ); 
} 
Смежные вопросы