在由自己的StringTokenizer创建的向量中查找项目

时间:2017-08-13 16:52:37

标签: c++

我已经创建了自己的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时,一切正常。否则程序崩溃了。我做错了什么?

1 个答案:

答案 0 :(得分:4)

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

您可以通过将其更改为:

轻松解决此问题
auto tokens = st.getTokens();
if(find(tokens.begin(), tokens.end(), item) != tokens.end())

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