【发布时间】:2020-10-22 15:28:00
【问题描述】:
在下面的sn-p中,
while(litr < = ritr) 效果很好,但是当尝试搜索向量中不存在的元素时, while(*litr < *ritr) 无法满足并超出范围并崩溃。 我明白,循环可以使用原始迭代器,但为什么迭代器取消引用不能满足循环条件?
bool binarySearch(std::vector<int> sorted_list, int item)
{
if(sorted_list.empty())
{
return false;
}
auto litr = sorted_list.begin();
auto ritr = sorted_list.end()-1;
while(litr <= ritr)
{
int leftindex = std::distance(sorted_list.begin(), litr);
int rightindex = std::distance(sorted_list.begin(), ritr);
int mid = (leftindex + ((rightindex-leftindex)/2));
if(sorted_list.at(mid) == item)
{
return true;
}
if(item < sorted_list.at(mid))
{
ritr = sorted_list.begin() + mid-1;
}
else
{
litr = sorted_list.begin()+ mid+1;
}
}
return false;
}
【问题讨论】:
-
你好。一方面,您想迭代向量
while(litr <= ritr)的其他所有项目。另一方面,您创建一个取决于实际向量值while(*litr < *ritr)的条件。是什么让您认为第二个版本会起作用?它取决于它们本身的向量值。我并不奇怪这会以糟糕的方式结束。条件完全不同。 -
你认为扣除是什么意思?你的意思是取消引用?就像 Jean-Marc 评论的那样,
while(litr <= ritr)与while(*litr < *ritr)没有任何相似之处 -
如果item小于sorted_list中最小的item,函数会崩溃,因为ritr会超出sorted_list的范围。你必须在一开始就检查这种可能性。
-
谢谢。更专注于取消引用部分。所以只是粘贴代码而不进行测试。但我现在明白了,为什么取消引用不起作用。
标签: c++ c++11 while-loop iterator