如果 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个元素,相当于什么都不做。
正在阅读有关 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 lastsize() - sz
elements from the sequence. Otherwise, appendssz - size()
default-inserted elements to the sequence.
因为 sz - size()
在你的情况下是 0
,所以它没有做任何事情。
来自[vector]
Effects: If
sz < size()
, erases the lastsize() - sz
elements from the sequence. Otherwise, appendssz - size()
default-inserted elements to the sequence.
在size() == sz
的情况下,它向序列中插入0个元素,相当于什么都不做。