在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);
// ...
}