如何从函数中返回迭代器,包括结束案例



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

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

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(即不是测试元素(,则我会得到一个segfault。我想做的就是返回末端向前迭代器,然后像main((一样,基于此。

编辑:我是C 的新手(大约一年(。我正在返回前进迭代器,因为以后我需要使用迭代器,这似乎更清楚(但可能是错误的(。据我所知,多件允许允许非唯一的键,但会订购唯一的键。我应该更清楚,并说时间顺序很重要,而不是关键顺序。我更喜欢在开发时不使用自动

您正在使用破坏对象的迭代器。通过引用通过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);
    // ...
}

最新更新