首页 > 解决方案 > 如何从包含结束情况的函数返回迭代器

问题描述

在 c++ 中,我需要通过字符串反向搜索包含一对的向量。我不能使用地图,因为字符串不是唯一的并且顺序很重要。然后,如果找到字符串,我想返回前向迭代器,如果找不到字符串,我想返回结束迭代器。

请参阅下面的我当前的代码。找到字符串时我没有问题,但是如果找不到字符串,我会在 main 的条件语句中得到一个段错误。

vector<pair<string, int>>::iterator prev_it(const string& pred, 
        vector<pair<string, int>> prevpreds) {
    vector<pair<string, int>>::reverse_iterator rit;
    for(rit = prevpreds.rbegin(); 
            rit != prevpreds.rend(); ++rit) {
        if (rit->first == pred) {
            return (rit+1).base();}
    }
    if(rit == prevpreds.rend()) {
        return prevpreds.end();
    }
}

主要是:

int main() {
    vector<pair<string, int>> test;
    for(int i = 0; i <= 5; ++i) {
        pair<string, int> mypair;
        mypair = make_pair("X"+to_string(i%4+1), i+1);
        test.emplace_back(mypair);
    }
    string tpred = "X"+to_string(6);

    vector<pair<string, int>>::iterator tit;
    tit = prev_it(tpred, test);

    if (tit != test.end()) {
        cout << tit->first << " " << tit->second << endl;
    }
    else {cout << "This is the end." << endl;}
}

如果 tpred 是 X1 到 X4 之一,则该代码有效。如果 tpred 是 X6(即不是测试元素),那么我会得到一个段错误。我希望能够做的是返回结束前向迭代器,然后,如在 main() 中,有一个基于此的条件。

编辑:我是 C++ 新手(大约一年)。我要返回一个前向迭代器,因为我稍后需要使用迭代器,这看起来更清楚(但我可能是错的)。据我了解,多重映射允许非唯一键,但会订购唯一键。我应该更清楚地说时间顺序很重要,而不是关键顺序。我不喜欢在开发时使用 auto ,因为我喜欢查看我正在使用的容器元素/迭代器,但要指出一点。

标签: c++c++11

解决方案


您正在使用被破坏对象的迭代器。通过prevpreds引用传递,因此迭代器保持有效。

vector<pair<string, int>>::const_iterator prev_it(const string& pred,
                                        const vector<pair<string, int>> &prevpreds)
{
    vector<pair<string, int>>::const_reverse_iterator rit;
    for (rit = prevpreds.rbegin();
            rit != prevpreds.rend(); ++rit)
    {
        if (rit->first == pred)
        {
            return (rit + 1).base();
        }
    }

    return prevpreds.end();
}

int main()
{
    // ...

    vector<pair<string, int>>::const_iterator tit; // <-- uses const iterator
    tit = prev_it(tpred, test);

    // ...
}

推荐阅读