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

Posted

技术标签:

【中文标题】通过空格将字符串解析为向量【英文标题】:Parse a string by whitespace into a vector 【发布时间】:2012-04-29 03:33:39 【问题描述】:

假设我有一串数字

"1 2 3 4 5 6"

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

【问题讨论】:

Stringstreams 和 getline 可以很好地解决这个问题。 std::stringstream mystringstream(mystring); std::copy(std::istream_iterator(mystringstream), std::istream_iterator(), std::back_inserter(myvector)); How to split a string in C++ How to split a string in C++?的可能重复 【参考方案1】:

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


【讨论】:

您可以改进该 while 循环。把while(s2)改成while(s2 &gt;&gt; tmp),也可以去掉循环内的break。 没问题。注意:如果您只是打印矢量。那么你真的不需要对成员进行修改访问。所以可能值得使用vector&lt;int&gt;::const_iterator【参考方案2】:
#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> vecStringToVector(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

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

【讨论】:

【参考方案3】:
#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;
;

【讨论】:

【参考方案4】:

尝试:

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

【讨论】:

以上是关于通过空格将字符串解析为向量的主要内容,如果未能解决你的问题,请参考以下文章

将字符向量转换为规则的事务

Cpp:将字符串片段解析为元组

将整数字符串转换为整数的2D向量

无法将文本文件行按空格分隔到向量中

如何通过行尾将字符串拆分为向量

Clojure CSV 解析引号中的逗号