vector :: erase()不起作用

Joe*_*oel 1 c++ vector

RemoveContact_HI创建了这个函数来删除向量中的元素:

void JNP::IPComm_HostType::RemoveContact_H( UINT contactIndex,std::vector<IPContact>& l )
{
    assert( contactIndex < l.size() );
    l.erase( l.begin() + contactIndex );
}
Run Code Online (Sandbox Code Playgroud)

但它似乎不起作用.调用该函数时,不会删除该元素.向量的大小减少1,但您仍然可以通过编码访问包括已删除元素在内的所有元素

hostList[some integer]
Run Code Online (Sandbox Code Playgroud)

即如果hostList有2个元素,我打电话

RemoveContact_H( 0, hostList )
Run Code Online (Sandbox Code Playgroud)

大小将减少到1,但两个元素仍然会退出并可以访问!

编辑

不出所料,错误是由于我的编码而不是vector :: erase()函数.我以前为IPContact类定义了equals运算符,它实际上没有复制任何数据.

Pie*_*aud 5

访问已从矢量中删除的元素是未定义的行为.有时它会起作用(你的情况),但它会在可能的最糟糕的时刻崩溃(即在演示期间,或在你的家庭面前;)).

但是,如果您使用std::vector::at访问已擦除的元素,它将抛出std::out_of_range异常.

std::vector::operator[]不执行边界检查.

大小将减少到1,但两个元素仍然会退出并可以访问!

就像我之前说的那样,它是未定义的行为,你不应该尝试访问已擦除的元素.试着这样做vector::at,它会抛出异常.