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

时间:2014-07-25 01:33:03

标签: c++ function iterator

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

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函数的返回值是否错误?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

if(*it=target)
    return it;

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

请注意g ++和clang emits a warning on this code都带有-Wall(即使没有它,clang也会发出警告)。您应该始终在高警告设置下编译代码。