5

Suppose I have a string of numbers

"1 2 3 4 5 6"

I want to split this string and place every number into a different slot in my vector. What is the best way to go about this

Steffan Harris
  • 9,106
  • 30
  • 75
  • 101

4 Answers4

6

Use istringstream to refer the string as a stream and >> operator to take the numbers. It will work also if the string contains newlines and tabs. Here is an example:

#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;
  }

}
Israel Unterman
  • 13,158
  • 4
  • 28
  • 35
  • 1
    You can improve that while loop. Change `while(s2)` into `while(s2 >> tmp)` then you can also remove the break inside the loop. – Martin York Apr 29 '12 at 10:03
  • No problems. Note: If you are just printing the vector. Then you really don't need modification access to the members. So it may be worth using `vector::const_iterator` – Martin York Nov 05 '13 at 20:56
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;
}

g++ -std=c++0x -o main main.cpp

this has the advantage of never pushing an empty string into the vector.
you can also choose what you want the separator to be.
maybe you could write some others: one for a vector of characters or maybe the delimiter could be a string? :)
good luck!

Trevor Hickey
  • 36,288
  • 32
  • 162
  • 271
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;
};
SDEZero
  • 363
  • 2
  • 13
0

try:

#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")
             );
}
Martin York
  • 257,169
  • 86
  • 333
  • 562