通过空格将字符串解析为向量

时间:2012-04-29 03:33:39

标签: c++ string vector

假设我有一串数字

"1 2 3 4 5 6"

我想拆分此字符串并将每个数字放入向量中的不同插槽中。什么是最好的方法

4 个答案:

答案 0 :(得分:5)

使用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 :(得分: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

这样做的好处是永远不会将空字符串推入向量中 你也可以选择你想要的分隔符。
也许你可以写一些其他的:一个用于字符向量,或者分隔符可能是一个字符串? :)
祝好运!

答案 2 :(得分: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;
};

答案 3 :(得分: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")
             );
}