如果std :: vector :: resize的size参数等于当前大小怎么办?

时间:2018-11-23 13:12:10

标签: c++ vector containers dynamic-memory-allocation

阅读有关vector :: resize http://www.cplusplus.com/reference/vector/vector/resize/

的手册

它只说大小大于或等于小会发生什么,而大小相等则不说。是否保证在相同大小的情况下不会重新分配数组并使迭代器无效?

我想避免一个分支,只处理2种情况(> =或<),而不是3种情况(<或>或==),但是如果未定义大小调整为相同大小,那么我也必须检查这种情况

5 个答案:

答案 0 :(得分:3)

这可能只是链接参考中的错误。标准说following

  

void resize(size_type sz);

     

效果:如果为sz < size(),则删除序列中的最后size() - sz个元素。否则,将sz - size()默认插入的元素附加到序列中。

由于在您的情况下sz - size()0,所以它什么也没做。

答案 1 :(得分:3)

来自[vector]

  

效果:如果为sz < size(),则删除序列中的最后size() - sz个元素。否则,将sz - size()默认插入的元素附加到序列中。

size() == sz的情况下,它在序列中插入0个元素,这与不执行任何操作一样。

答案 2 :(得分:2)

现在,可能大多数实现对于什么都不需要做并且实际上什么也不做的情况足够聪明。

但是我问自己,您打算调用resize,为什么您仍然持有迭代器?基本上,您永远不应再持有迭代器,尤其是在容器可能会调整大小时。只需以不需要在大小调整点上保留迭代器的方式编写算法即可。

我在这里疯狂地猜测,但是也许您没有使用正确的容器,并且关于要实现的目标的更多上下文可能会得出更有用的答案。

答案 3 :(得分:1)

似乎您在询问在调用resize(size())时迭代器是否无效。答案是否定的,迭代器不会失效。可能几乎不会发生任何事情,但是迭代器失效肯定不会发生,因为这只会在必须重新分配存储空间时发生,而如果调整大小为空操作则永远不会发生。

答案 4 :(得分:-1)

std::vector<>实现:

void resize(size_type __new_size)
{
    if (__new_size > size())
        _M_default_append(__new_size - size());
    else if (__new_size < size())
        _M_erase_at_end(this->_M_impl._M_start + __new_size);
}

所以,正如预期的那样:它什么也不做。

编辑:
取自我的RHEL服务器,g ++和C ++库软件包版本5.3。