c++ - 如何从包含结束情况的函数返回迭代器
问题描述
在 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 ,因为我喜欢查看我正在使用的容器元素/迭代器,但要指出一点。
解决方案
您正在使用被破坏对象的迭代器。通过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);
// ...
}
推荐阅读
- r - R:正则表达式捕获给定字符之后的所有实例
- python - Boto3 按组 id 删除安全组
- vue.js - 如何使用 vuex 仅修改存储中的嵌套数组属性
- highcharts - highcharts 导出服务器 - 带有 curl / POST 的变量饼图
- notepad++ - 用记事本++中的增量计数器替换特定单词 - 定义计数器的起点
- matlab - 如何在 symfun 类型的函数上使用 matlab 中的 interp1 函数?
- python - 我无法使用 exchangelib 读取交换日历
- regex - 处理带有可选分隔符的行
- php - 占位符不选择数据的问题
- android - 反应原生未定义不是一个函数(评估'_app2.default.auth()')