运行时错误 - 矢量迭代器不可解除引用?

时间:2012-04-03 00:39:33

标签: vector iterator

上课时,我正在制作一个管理酒店的程序。我的程序到达此函数时出现运行时错误:向量迭代器不可解除引用。我使用调试器来查找问题区域,但我无法弄清楚它有什么问题。有什么建议吗?

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函数正确格式化为代码。

1 个答案:

答案 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