假设我有一串数字
"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 <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")
);
}
#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 <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
这具有永远不会将空字符串推入向量的优点。
你也可以选择你想要的分隔符。
也许你可以写一些其他的:一个用于字符向量,或者分隔符可能是一个字符串?:)
祝你好运!