1

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 运算符,它实际上并没有复制任何数据。

4

2 回答 2

5

访问已经从向量中删除的元素是未定义的行为。有时它会起作用(您的情况),但它会在可能的最坏时刻崩溃(即在演示期间,或在您的家人面前;))。

但是如果你std::vector::at用来访问已经擦除的元素,就会抛出std::out_of_range异常。

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

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

就像我之前说的,这是未定义的行为,您不应该尝试访问已擦除的元素。尝试使用vector::at,它会抛出异常。

于 2013-09-04T09:57:37.763 回答
3

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

没有。如果向量的大小为 1,则仅存在一个元素(索引 0),并且只能访问该元素。尝试访问超出此范围的元素是未定义的行为,因此它可能会使您的程序崩溃,或者它可能看起来可以工作,谁知道呢,但在后一种情况下,这不会使您的代码更加正确。

换句话说,std::vector::erase()它的行为是应该的,只是你没有std::vector按照你应该的方式使用(即你绝不能尝试访问结束后的元素)。

您可能想使用std::vector::at()而不是std::vector::operator []()为了自己验证只有索引 0 是可访问的。

于 2013-09-04T09:50:33.437 回答