如何在C++中返回有效的迭代器
How to return a valid iterator in C++?
我正在编写一个函数来查找向量中的元素,并向该元素返回迭代器:
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
。由于target
是5
,因此表达式的值也是5
,这相当于true
。因此,对于非零的target
,函数将把target
分配给ivec
的第一个元素,并返回ivec.begin()
。很明显,减少迭代器会导致未定义的行为。
请注意,g++和clang都会使用-Wall
对此代码发出警告(clang即使没有它也会发出警告(。您应该始终在高警告设置下编译代码。
相关文章:
- 钳制迭代器是否有效
- 为什么以这种方式使用迭代器有效?
- 如何将迭代器(包括结束和开始之前的迭代器)测试到列表或forward_list保持有效
- 索引与迭代器 - 哪个更有效?
- 有效的迭代器范围从堆栈上的char
- 如何普遍有效地填充缓冲液?(传递插入迭代器?器皿?等)
- 字符串::替换在有效的迭代器上抛出 std::out_of_range
- 如何检查迭代器指定的范围是否有效
- 检查迭代器是否对QT容器有效
- 无法使用迭代器遍历字符串:但是我的带有索引的版本确实有效
- Const与非Const迭代器的比较是否有效
- 如何在C++中返回有效的迭代器
- 获得映射迭代器索引的最有效方法?c++
- 使用迭代器访问映射的特定键的最有效方法
- 检查简化迭代器是否指向有效元素
- std::map::erase(it++)是否维护一个指向映射中下一个元素的有效迭代器
- 在擦除()之后保留一个有效的向量::迭代器
- 如何简化检查搜索算法返回的迭代器是否有效
- 有效地计数两个std::multimap迭代器之间的条目数
- 对迭代器解引用时是否有效?