上课时,我正在制作一个管理酒店的程序。我的程序到达此函数时出现运行时错误:向量迭代器不可解除引用。我使用调试器来查找问题区域,但我无法弄清楚它有什么问题。有什么建议吗?
Customer & ListOfCustomers::getByID(int id)
{
if(!sortedByID)sortByID();
vector<Customer>::iterator iter;
Customer cus;
cus.customerID=id;
iter = lower_bound(customers.begin(),customers.end(),cus,compareCustomersByID);
if( (*iter).customerID == id ) // <---DEBUGGER SAYS ERROR HERE IN THIS LINE
{
return *iter;
}
else
{
return NullCustomer();
}
}
这是lower_bound函数。它是内部#include算法
template<class _FwdIt,
class _Ty,
class _Pr> inline
_FwdIt lower_bound(_FwdIt _First, _FwdIt _Last,
const _Ty& _Val, _Pr _Pred)
{// find first element not before _Val, using _Pred
// _DEBUG_ORDER_PRED(_First, _Last, _Pred);
return (_Rechecked(_First,
_Lower_bound(_Unchecked(_First), _Unchecked(_Last), _Val, _Pred,
_Dist_type(_First))));
}
编辑:添加了一个空格,以便将lower_bound函数正确格式化为代码。
答案 0 :(得分:0)
您正在使用lower_bound
功能进行搜索。它的目的与此有点不同。 This是lower_bound的作用:
返回指向排序范围[first,last]中第一个元素的迭代器,该元素的值不比value小。
来自here的另一个定义:
具体来说,它返回第一个位置,其中可以插入值而不违反排序。
所以例如,如果你要查找的东西不在向量中,它将返回一个迭代器,它指向后向量中的最后一项,并且迭代器不能被解引用因为它不存在。
看一下这个例子:
int myints[] = {10,20,30,30,20,10,10,20};
vector<int> v(myints,myints+8); // 10 20 30 30 20 10 10 20
vector<int>::iterator low;
sort (v.begin(), v.end()); // 10 10 10 20 20 20 30 30
low=lower_bound (v.begin(), v.end(), 60); // ^it will point here
cout << "lower_bound at position " << int(low- v.begin()) << endl;
从输出中可以看出,迭代器将指向向量中的第9个元素(索引8)。但是向量只有8个元素(索引为0-7)。对此的解释是您可以在索引8的向量中插入新项而不违反排序。
我认为你真正想要的是find
功能。这是一个例子:
int myints[] = {10,20,30,30,20,10,10,20};
vector<int> v(myints,myints+8); // 10 20 30 30 20 10 10 20
vector<int>::iterator find_it1 = find(v.begin(), v.end(), 30);
vector<int>::iterator find_it2 = find(v.begin(), v.end(), 80);
if(find_it1 == v.end())
cout << "30 not found" << endl;
else
cout << "30 found at position " << int(find_it1 - v.begin()) << endl;
if(find_it2 == v.end())
cout << "80 not found" << endl;
else
cout << "80 found at position " << int(find_it2 - v.begin()) << endl;
这是输出:
30 found at position 2
80 not found