【问题标题】:vector::erase() not working矢量::erase() 不工作
【发布时间】:2013-09-04 09:45:23
【问题描述】:

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

【问题讨论】:

    标签: c++ vector


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 好的,感谢您的提示,但它仍然无法回答问题。如果我在一个向量中有两个元素,我将擦除索引为 0 的元素,那么索引 1 是否应该重新分配给索引 0?如果我然后调用vector::at(0),它仍然返回索引1的元素,该元素应该被上次调用删除?
    【解决方案2】:

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

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

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

    您可能希望使用std::vector::at() 而不是std::vector::operator []() 以自行验证是否只能访问索引0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 2011-05-30
      • 2020-08-22
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多