vector :: erase()不起作用

时间:2013-09-04 09:45:23

标签: 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 );
}

然而它似乎不起作用。调用该函数时,不会删除该元素。向量的大小减少1,但您仍然可以通过编码

访问所有元素,包括已删除的元素
hostList[some integer]

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

RemoveContact_H( 0, hostList )

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

修改

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

2 个答案:

答案 0 :(得分:5)

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

但是如果您使用std::vector::at来访问已删除的元素,则会抛出std::out_of_range例外。

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

  

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

就像我之前说过的,它是 Undefined Behavior ,你不应该尝试访问已删除的元素。尝试使用vector::at,它会抛出异常。

答案 1 :(得分:3)

  

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

即可。如果向量的大小为1,则只存在一个元素(索引0),并且只能访问此元素。试图访问除此之外的元素是未定义的行为,因此它可能会使程序崩溃,或者它可能出现工作,谁知道,但在后一种情况下,不会使您的代码更正确。

换句话说,std::vector::erase()表现得应该如此,只是你没有使用std::vector(例如,你必须永远不要尝试访问结尾的元素)。

您可能希望使用std::vector::at()代替std::vector::operator [](),以便自行验证只有索引0可以访问。