Nếu bạn thú vị trong làm thế nào để làm điều đó cho mình và không sử dụng tăng.
Giả sử chuỗi dấu phân cách có thể rất dài - hãy nói M, kiểm tra mỗi char trong chuỗi của bạn nếu nó là dấu phân cách, sẽ có giá O (M) mỗi, vì vậy làm như vậy trong vòng lặp cho tất cả ký tự trong thư gốc của bạn chuỗi, hãy nói theo chiều dài N, là O (M * N).
Tôi sẽ sử dụng từ điển (như bản đồ - "dấu tách" đến "booleans" - nhưng ở đây tôi sẽ sử dụng mảng boolean đơn giản có giá trị index = ascii cho mỗi dấu phân tách).
Bây giờ lặp lại trên chuỗi và kiểm tra xem char là dấu phân cách là O (1), cuối cùng cho chúng ta O (N) tổng thể.
Đây là mẫu mã của tôi:
const int dictSize = 256;
vector<string> tokenizeMyString(const string &s, const string &del)
{
static bool dict[dictSize] = { false};
vector<string> res;
for (int i = 0; i < del.size(); ++i) {
dict[del[i]] = true;
}
string token("");
for (auto &i : s) {
if (dict[i]) {
if (!token.empty()) {
res.push_back(token);
token.clear();
}
}
else {
token += i;
}
}
if (!token.empty()) {
res.push_back(token);
}
return res;
}
int main()
{
string delString = "MyDog:Odie, MyCat:Garfield MyNumber:1001001";
//the delimiters are " " (space) and "," (comma)
vector<string> res = tokenizeMyString(delString, " ,");
for (auto &i : res) {
cout << "token: " << i << endl;
}
return 0;
}
Lưu ý: tokenizeMyString trả về vector theo giá trị và tạo ra nó trên stack đầu tiên, vì vậy chúng tôi đang sử dụng ở đây sức mạnh của trình biên dịch >>> RVO - giá trị trả về tối ưu hóa :)
Boost.StringAlgorithm hoặc Boost.Tokenizer sẽ hữu ích. –
Hoặc, một số ý tưởng bạn có thể nhận được từ câu trả lời này: http://stackoverflow.com/questions/4888879/elegant-ways-to-count-the-frequency-of-words-in-a-file – Nawaz
@ K-ballo : Theo câu hỏi, bạn không nên sử dụng các thư viện bên ngoài như Boost. – deepmax