我做了自己的StringTokenizer类:

class StringTokenizer {
private:
    vector<string> tokens; //output
    string strIn;          //input
public:
    StringTokenizer(string strIn) {
        this->strIn = strIn;

        string str(strIn);
        string tmpstr;
        stringstream ss(str);

        while(ss >> tmpstr)
            tokens.push_back(tmpstr);
    }

    vector<string> getTokens() {
        return tokens;
    }
}


我有我的主要职能

int main() {
    string str = "a b c d";
    StringTokenizer st(str);

    if(find(st.getTokens().begin(), st.getTokens().end(), item) != st.getTokens().end()) {
        cout << "found";
    } else {
        cout << "not found";
    }
}


当函数返回true时,一切正常。否则程序将崩溃。我究竟做错了什么?

最佳答案

您的代码中有未定义的行为,getTokens()按值返回向量,然后调用两次(对于begin()一次,对于end()一次),这意味着您的两个迭代器不会指向同一容器。这根本行不通。然后,您第三次调用它来比较find的结果,由于同样的原因,该结果也不正确。

您可以将其更改为:

auto tokens = st.getTokens();
if(find(tokens.begin(), tokens.end(), item) != tokens.end())


或者您可以从const vector<string>&返回getTokens()

08-27 02:26