1

この質問にはいくつかの例があります。しかし、ほとんどの答えは私が探しているものではありません。

ブーストやその他の非 STL ライブラリを使用するのではなく、効率的で簡単な機能を実装する方法を探しています。理由を私に尋ねると、ほとんどのコーディング コンテストやインタビューで、それらの使用が許可されていません。

これが私がアプローチできる最も近いものです:

vector<string> SplitString(const char *str, char c)
{
    vector<string> result;
    do {
        const char *begin = str;
        while(*str != c && *str) {
            str++;
        }
        result.push_back(string(begin, str));
    } while (0 != *str++);
    return result;
}

int main() {

    string mainString = "This is a sentence. Another sentence. The third sentence. This is the last sentence.";
    vector<string> sentences;
    sentences = SplitString(mainString.c_str(), '.');
    while (!sentences.empty()) {
        cout << sentences.back() << endl;
        sentences.pop_back();
    }
    return 0;
}

これの問題は、文字列ではなく文字区切り文字しか持てないことです。いくつかの方法を実装することを考えましたが、あまりにも複雑に思えました。私が考えた最も簡単な方法は、区切り文字を char 配列に変換しcて、この後に区切り文字 char 配列の最初の文字として使用することでした。

while(*str != c && *str) {
    str++;
}
const char *beginDelim = *cArr;
while(1) {
    if (*str == *cArr && *str && *cArr) {
       str++;
       cArr++;
    }
    else if (!*cArr) {
        break;
    }
    else if (*cArr) {
        cArr = beginDelim;
    }
}

そして、コードはresult.push_back()部分から続きます。

それで、文字列区切り記号で文字列を分割するための効率的で簡単な関数を実装する方法があるかどうか疑問に思っていましたか?

4

5 に答える 5

0
#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<string> SplitString(string str, const string &delim) {
    vector<string> result;
    size_t found;
    while((found = str.find(delim)) != string::npos) {
        result.push_back(str.substr(0, found));
        str = str.substr(found + delim.size());
    }
    return result;
}

int main() {
    string mainString = "This is a sentence. Another sentence. The third sentence. This is the last sentence.";
    vector<string> sentences;

    sentences = SplitString(mainString, ".");

    for(auto& sentence : sentences) {
        cout << sentence << endl;   
    }
    return 0;
}
于 2014-03-28T16:00:21.787 に答える
0

これはどうですか:

#include <vector>
#include <algorithm>
#include <string>

using namespace std;

vector<string> SplitString(const string &str, const string &delim)
{
    vector<string> ret;
    string::const_iterator prev = str.begin();

    for (string::const_iterator i = str.begin(); i < str.end() - delim.length()+1; ++i)
    {
        if (equal(delim.begin(), delim.end(), i)) {
            ret.push_back(string(prev,i));
            i += delim.length()-1;
            prev = i+1;
        }
    }

    ret.push_back(string(prev,str.end()));

    return ret;
}
于 2013-07-12T16:03:53.193 に答える
0
vector<string>split(string str, const char d){
    string temp;
    vector<string>vct;
    for(int i = 0; str[i] != '\0'; i++){
        if(str[i] != d){
            temp += str[i];
        }else if(!empty(temp)){
                vct.push_back(temp), temp.clear();
        }
    }
    vct.push_back(temp);
    return vct;
}

2 つの引数を取ります

  • const char d区切りとして。
  • string str分割する文字列として。

vector分割された文字列を aとitに格納しますreturns。ただし、このコードの効率についてはわかりません。:)

于 2020-02-23T06:33:13.753 に答える
0

このような何かがそれを行う必要があります:

vector<string> SplitString(const char* str,const char* d) {
  vector<string> result;
  size_t len = strlen(d);
  const char* start = str;
  while ( str = strstr(start,d) ) {
    result.push_back(string(start,len));
    start = str + len;
  }
  result.push_back(start);
  return result;
}
于 2013-07-12T15:55:32.077 に答える