Ik probeer de woorden van een string te itereren.
De tekenreeks kan worden verondersteld te zijn samengesteld uit woorden gescheiden door spaties.
Merk op dat ik'niet geïnteresseerd ben in C string functies of dat soort karakter manipulatie/toegang. Geef in je antwoord ook voorrang aan elegantie boven efficiëntie.
De beste oplossing die ik op dit moment heb is:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
string s = "Somewhere down the road";
istringstream iss(s);
do
{
string subs;
iss >> subs;
cout << "Substring: " << subs << endl;
} while (iss);
}
Is er een elegantere manier om dit te doen?
Dit is mijn favoriete manier om door een string te lopen. Je kunt per woord doen wat je wilt.
string line = "a line of text to iterate through";
string word;
istringstream iss(line, istringstream::in);
while( iss >> word )
{
// Do something on `word` here...
}
De STL beschikt nog niet over een dergelijke methode.
Je kunt echter ofwel C's strtok()
functie gebruiken door gebruik te maken van het std::string::c_str()
lid, of je kunt je eigen schrijven. Hier is een code voorbeeld dat ik vond na een snelle Google zoektocht ("STL string split"):
void Tokenize(const string& str,
vector<string>& tokens,
const string& delimiters = " ")
{
// Skip delimiters at beginning.
string::size_type lastPos = str.find_first_not_of(delimiters, 0);
// Find first "non-delimiter".
string::size_type pos = str.find_first_of(delimiters, lastPos);
while (string::npos != pos || string::npos != lastPos)
{
// Found a token, add it to the vector.
tokens.push_back(str.substr(lastPos, pos - lastPos));
// Skip delimiters. Note the "not_of"
lastPos = str.find_first_not_of(delimiters, pos);
// Find next "non-delimiter"
pos = str.find_first_of(delimiters, lastPos);
}
}
Overgenomen van: http://oopweb.com/CPP/Documents/CPPHOWTO/Volume/C++Programmeren-HOWTO-7.html
Als je vragen hebt over het code voorbeeld, laat een commentaar achter en ik zal het uitleggen.
En alleen omdat het geen typedef
genaamd iterator implementeert of de <<
operator niet overload wil niet zeggen dat het slechte code is. Ik gebruik C functies vrij vaak. Bijvoorbeeld, printf
en scanf
zijn beide sneller dan std::cin
en std::cout
(aanzienlijk), de fopen
syntax is een stuk vriendelijker voor binaire types, en ze hebben ook de neiging om kleinere EXE's te produceren.
Laat je niet verleiden tot deze "Elegantie boven prestatie" deal.
Het gebruik van std::stringstream
zoals je hebt werkt perfect, en doet precies wat je wilde. Als je echter op zoek bent naar een andere manier om dingen te doen, kun je std::find()
/std::find_first_of()
en std::string::substr()
gebruiken.
Hier's een voorbeeld:
#include <iostream>
#include <string>
int main()
{
std::string s("Somewhere down the road");
std::string::size_type prev_pos = 0, pos = 0;
while( (pos = s.find(' ', pos)) != std::string::npos )
{
std::string substring( s.substr(prev_pos, pos-prev_pos) );
std::cout << substring << '\n';
prev_pos = ++pos;
}
std::string substring( s.substr(prev_pos, pos-prev_pos) ); // Last word
std::cout << substring << '\n';
return 0;
}