Предположим, у меня есть строка цифрРазобрать строку пробелами в вектор
"1 2 3 4 5 6"
Я хочу разделить эту строку и поместить каждое число в другой слот в моем векторе. Что такое лучший способ пойти об этом
Предположим, у меня есть строка цифрРазобрать строку пробелами в вектор
"1 2 3 4 5 6"
Я хочу разделить эту строку и поместить каждое число в другой слот в моем векторе. Что такое лучший способ пойти об этом
#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;
}
г ++ -std = C++ 0x -o главный main.cpp
это преимущество никогда не толкая пустую строку в вектор.
вы также можете выбрать, что вы хотите от разделителя.
Возможно, вы могли бы написать несколько других: один для вектора символов или, может быть, разделитель может быть строкой? :)
удачи!
Используйте 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)', после чего вы также можете удалить разрыв внутри цикла. –
@ Loki Astari - Спасибо, сделано. –
Нет проблем. Примечание. Если вы просто печатаете вектор. Тогда вам действительно не нужно изменять доступ к членам. Поэтому, возможно, стоит использовать 'vector
#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")
);
}
Stringstreams и 'getline' хорошо работать для этого. – chris
std :: stringstream mystringstream (mystring); std :: copy (std :: istream_iterator (mystringstream), std :: istream_iterator (), std :: back_inserter (myvector)); –
[Как разбить строку на C++] (http://stackoverflow.com/questions/236129) – Blastfurnace