通过空格将字符串解析为向量
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使用 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 >> tmp)
,也可以去掉循环内的break。
没问题。注意:如果您只是打印矢量。那么你真的不需要对成员进行修改访问。所以可能值得使用vector<int>::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")
);
【讨论】:
以上是关于通过空格将字符串解析为向量的主要内容,如果未能解决你的问题,请参考以下文章