【问题标题】: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));

标签: c++ string vector


【解决方案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> 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

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

【讨论】:

    【解决方案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")
                   );
      }
      

      【讨论】:

        猜你喜欢
        • 2014-01-06
        • 2023-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多