- ++.
: ++
, , , strtok():
strtok() , ++ white space . , white space , , , .
#include <locale>
#include <string>
#include <sstream>
#include <iostream>
class WordSplitterFacet: public std::ctype<char>
{
public:
typedef std::ctype<char> base;
typedef base::char_type char_type;
WordSplitterFacet(std::locale const& l)
: base(table)
{
std::ctype<char> const& defaultCType = std::use_facet<std::ctype<char> >(l);
static char data[256];
for(int loop = 0;loop < 256;++loop) { data[loop] = loop;}
defaultCType.is(data, data+256, table);
table[','] |= base::space;
table['.'] |= base::space;
table['-'] |= base::space;
}
private:
base::mask table[256];
};
:
std::ctype<char>* wordSplitter(new WordSplitterFacet(std::locale()));
<stream>.imbue(std::locale(std::locale(), wordSplitter));
, . , ++ . std::vector/std::string. , , .
Separation of Concerns, . ( ), - ( ). , . , std::vector/std::string, -.
, tokenize - → . . , .
std::vector<std::string> data;
for(std::istream_iterator<std::string> loop(<stream>); loop != std::istream_iterator<std::string>(); ++loop)
{
data.push_back(*loop);
}
, .
std::copy(std::istream_iterator<std::string>(<stream>), std::istream_iterator<std::string>(), std::back_inserter(data));
int main()
{
std::ctype<char>* wordSplitter(new WordSplitterFacet(std::locale()));
std::stringstream teststr;
teststr.imbue(std::locale(std::locale(), wordSplitter));
teststr << "This, stri,plop";
cout << "die monster !";
std::vector<std::string> data;
std::copy(std::istream_iterator<std::string>(teststr), std::istream_iterator<std::string>(), std::back_inserter(data));
std::copy(data.begin(), data.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}