C++ 返回无效的迭代器

问题描述

我的任务是:

编写一个函数,将一对迭代器带入一个向量,然后 一个整数值。在范围内查找该值并将迭代器返回到 请求的元素。

我对上述任务的实现是:

#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::vector;

using data = vector<int>;
using iter = data::const_iterator;

iter contains(const data,iter,int);

int main() {
    data numbers{1,2,5,7,9,14,18};
    iter b_iter = numbers.begin() + 2;
    iter e_iter = numbers.end();
    iter found = contains(numbers,b_iter,e_iter,13);

    if (found == numbers.end())
        cout << "not found" << endl;
    else
        cout << *found << endl;

    return 0;
}

iter contains(const data container,iter b_iter,iter e_iter,int num) {
    while (b_iter != e_iter) {
        if (*b_iter == num)
            return b_iter;
        b_iter++;
    }

    return container.end();
}

如您所见,我从头到尾进行迭代,如果找到搜索值则返回。否则,函数返回迭代器以传递最后一个元素 (container.end())。但是这个程序将 0 输出到控制台,我期望在那里 not found。当更新我的函数的第一个参数以引用数据而不是像这样的值时:

iter contains(const data&,int);

函数按预期工作,not found 被打印到终端。为什么按值传递数据没有按预期工作?

解决方法

container 按值传递时,它是从参数复制的新 vector。那么对于 return container.end();,返回的迭代器属于 container 但与原来的 vector numbers 无关。

您应该直接返回 e_iter,而无需像 STL 算法那样传递 vector

iter contains(iter b_iter,iter e_iter,int num) {
    while (b_iter != e_iter) {
        if (*b_iter == num)
            return b_iter;
        b_iter++; // or ++b_iter; for efficiency
    }

    return e_iter;
}

并通过与 e_iter 进行比较来检查结果。

iter found = contains(b_iter,e_iter,13);

if (found == e_iter)
    cout << "not found" << endl;
else
    cout << *found << endl;