如果我有一个标准的C++容器,std::vector<Bar>并通过调用.resize()小于当前的大小来缩小它,.size()那么多余的元素被破坏了?
(如果你能找到两个不同的实现,那么实现选择很有意思.)
(这是受詹姆斯坎泽的评论启发.)
Bar*_*rop 14
2012年1月的工作草案包含C++ 11标准以及次要的编辑更改.
用于vector:
void resize(size_type sz);
E ff ects:Ifsz <= size(),相当于erase(begin() + sz, end());.如果size() < sz,将sz - size()值初始化元素附加 到序列.
vector::erase没有指定删除顺序.我希望它是为了从begin() + sz给end(),因为这对我来说很有意义,但是,这只是我的期望.我在标准中找不到任何相关内容.
vector使用Visual Studio 2013分发的实现确实按照这个顺序擦除,MinGW的g ++ 4.8.1以及g ++ 4.7.3(不是MinGW)也是如此.这些是我碰巧可以轻松访问的编译器.
在同一标准中,用于list:
void resize(size_type sz);
1 E ff ects:Ifsize() < sz,将sz - size()值初始化元素附加到序列中.如果sz <= size(),相当于
list<T>::iterator it = begin();
advance(it, sz);
erase(it, end());
Run Code Online (Sandbox Code Playgroud)
和
void resize(size_type sz, const T& c);
ËFF学分:
if (sz > size())
insert(end(), sz-size(), c);
else if (sz < size()) {
iterator i = begin();
advance(i, sz);
erase(i, end());
}
else
; // do nothing
Run Code Online (Sandbox Code Playgroud)
然后它继续指定绝对没有任何有用的订购list::erase.
list使用Visual Studio 2013分发的实现似乎以相反的顺序擦除,而MinGW的g ++ 4.8.1和g ++ 4.7.3(不是MinGW)则没有.
对于 vector
void resize(size_type sz);
效果:如果sz <= size(),相当于通话pop_back()size() - sz时间.如果size() < sz,将sz - size()默认插入的元素附加到序列中.
这表示元素以相反的顺序被删除.
用于list:
void resize(size_type sz);
1 E ff ects:Ifsize() < sz,将sz - size()值初始化元素附加到序列中.如果sz <= size(),相当于
list<T>::iterator it = begin();
advance(it, sz);
erase(it, end());
Run Code Online (Sandbox Code Playgroud)
和
void resize(size_type sz, const T& c);
ËFF学分:
if (sz > size())
insert(end(), sz-size(), c);
else if (sz < size()) {
iterator i = begin();
advance(i, sz);
erase(i, end());
}
else
; // do nothing
Run Code Online (Sandbox Code Playgroud)
然后它继续指定绝对没有任何有用的订购list::erase.
对于deque标准指定了与之相同的行为vector.
随着外std::basic_string和
std::forward_list,该标准定义resize来讲
erase(在新的大小比原来的大小更小的情况下),所以真正的问题是:没有erase( begin, end )规定破坏的任何命令.我在这里可以找到的所有内容都在表100中,其中表示erase( q1, q2 )
"删除范围内的元素[q1, q2)".对我来说(至少对我而言)仍然存在问题:当标准使用符号[q1, q2)(在哪里q1和q2是迭代器)时,它是否意味着有序或不符合?先验,我想不会.至少在本<algorithms>节中,它明确说明了操作必须按顺序进行的操作(以及它在某些特定情况下明确说明它的事实,这表明在未指定操作时不需要它).
对于它的价值:因为std::list<>::resize(),g ++调用以升序删除; VS按降序排列.在VS的情况下,这与销毁的顺序不同
std::list<>::erase(如果未指定销毁的顺序,并且允许从一次调用到下一次调用,则可能是合法的).
| 归档时间: |
|
| 查看次数: |
651 次 |
| 最近记录: |