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

Parse a string by whitespace into a vector

本文关键字:向量 字符串 空格      更新时间:2023-10-16

假设我有一串数字

"1 2 3 4 5 6"

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

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

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

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

尝试:

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