如何在C++中返回有效的迭代器

How to return a valid iterator in C++?

本文关键字:有效 迭代器 返回 C++      更新时间:2023-10-16

我正在编写一个函数来查找向量中的元素,并向该元素返回迭代器:

vector<int>::iterator findelement(vector<int> &ivec, int target)
{
    auto it=ivec.begin();
    while(it!=ivec.end())
    {
        if(*it=target)
            return it;
        else ++it;
    }
    return ivec.end();
}

然后我将返回迭代器复制到另一个迭代器。我可以正确地取消引用迭代器:

vector<int> numbers{1,2,3,4,5,6,7,8,9,10};
auto iter=findelement(numbers,5);
cout<<*iter;

输出为5。但是,当我递增/递减迭代器时,出现了一些错误:

--iter;
cout<<*iter; //I think the output should be 4, but the output is 134281917!

findelement函数的返回值是否错误?

numbers的第一个元素被您的搜索值覆盖。当赋值发生时,赋值表达式为true,并将迭代器返回到第一个元素。

if(*it=target) {
   return it;
}

因为您已经处于开始阶段,所以迭代器是不可递减的(或者根据编译器设置,将打印出向量之前的位置值(。要解决此问题,请执行比较而不是赋值(*it == target(。

if(*it=target)
    return it;

这将target分配给*it。由于target5,因此表达式的值也是5,这相当于true。因此,对于非零的target,函数将把target分配给ivec的第一个元素,并返回ivec.begin()。很明显,减少迭代器会导致未定义的行为。

请注意,g++和clang都会使用-Wall对此代码发出警告(clang即使没有它也会发出警告(。您应该始终在高警告设置下编译代码。