达到容量时矢量元素重复
Vector element duplication when capacity is reached
在程序中如下所示:
#include <vector>
#include <memory>
#include <iostream>
int main()
{
std::vector<std::shared_ptr<int>> v{ std::make_shared<int>() };
for ( auto i = v.capacity() - v.size() + 1; i-- > 0; )
v.push_back( v.back() );
for ( auto i = v.capacity() - v.size() + 1; i-- > 0; )
v.insert( v.end(), --v.end(), v.end() );
for ( const auto & p : v )
{
std::cout << ( p ? "valid_ptr" : "null" ) << std::endl;
}
return 0;
}
一些编译器输出(Visual Studio,ellcc(:
valid_ptr
valid_ptr
valid_ptr
而其他(gcc、clang、icc(输出:
valid_ptr
valid_ptr
null
假设使用push_back
复制最后一个元素总是正确工作,即使矢量达到其容量并需要重新分配,这是正确的吗?
同时,使用insert
复制最后一个元素是一种未定义的行为还是特定于实现的行为?
v.insert( v.end(), --v.end(), v.end() )
表现出未定义的行为,违反了标准库函数的先决条件。[sequence.reqmts]/4中的表87表示:
a.insert(p,i,j)
要求:i
和j
不是a
的迭代器。
v.push_back( v.back() );
是保证工作的,我相信。参见DR#526说";vector::insert(iter, value)
必须工作,因为标准没有允许它不工作"push_back
应该出于同样的原因工作。
DR#2164中讨论了一类更广泛的问题,其中emplace
可以采用任意数量的自变量,其中一些自变量可以引用容器的元素和/或其子对象。共识似乎是,应该要求执行才能使其发挥作用。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 插入元素后矢量容量增加
- "Safe"将元素添加到 std::vector 的方法,超出了其 size() 但低于其容量 ()
- 如何在vector::clear()上保持向量元素的容量
- std:删除元素后,字符串容量保持不变,所以它是否占用了一些内存
- 设置*both*元素和std::vector的初始容量
- 一旦满足指定容量,覆盖优先级队列末尾的元素
- 如何将std::vector的容量限制为元素的数量