我正在编写一个函数来查找向量中的元素并将迭代器返回给该元素:
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函数的返回值是否错误?
答案 0 :(得分:3)
numbers
的第一个元素被您的搜索值覆盖。赋值发生时,赋值表达式为true,并将迭代器返回给第一个元素。
if(*it=target) {
return it;
}
因为您已经在开头,所以迭代器不可递减(或者根据您的编译器设置,将在向量之前打印出位置的值)。要解决此问题,请进行比较而不是分配(*it == target
)。
答案 1 :(得分:2)
if(*it=target)
return it;
这会将target
分配给*it
。由于target
为5
,因此表达式的值也为5
,相当于true
。因此,如果使用非零target
,您的函数会将target
分配给ivec
的第一个元素并返回ivec.begin()
。很明显,递减迭代器会导致未定义的行为。
请注意g ++和clang emits a warning on this code都带有-Wall
(即使没有它,clang也会发出警告)。您应该始终在高警告设置下编译代码。