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

What if size argument for std::vector::resize is equal to the current size?

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

的手册

它只说如果大小更大或更小会发生什么,但没有说如果大小相等会发生什么。是否保证在相同大小下它不会重新分配数组并使迭代器无效?

我想避免一个分支并且只处理 2 个案例(>= 或 <)而不是 3 个(< 或 > 或 ==),但是如果未定义调整到相同的大小,那么我将不得不检查案例也是。

您似乎在询问在调用 resize(size()) 时迭代器是否会失效。答案是否定的,迭代器不会失效。可能根本不会发生,但肯定不会发生迭代器失效,因为只有在必须重新分配存储时才会发生这种情况,如果调整大小是空操作,那将永远不会发生。

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

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

我在这里胡乱猜测,但也许您没有使用正确的容器,更多关于您想要实现的目标的上下文可能会导致更有用的答案。

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.

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

void resize(size_type sz);

Effects: If sz < size(), erases the last size() - sz elements from the sequence. Otherwise, appends sz - size() default-inserted elements to the sequence.

因为 sz - size() 在你的情况下是 0,所以它没有做任何事情。

来自[vector]

Effects: If sz < size(), erases the last size() - sz elements from the sequence. Otherwise, appends sz - size() default-inserted elements to the sequence.

size() == sz的情况下,它向序列中插入0个元素,相当于什么都不做。