在填充载体
回答
所以,这里的差异,我会让你决定什么是最适合你的情况。
v.clear();
v.resize(3, 1);
在这种情况下,我们已经将矢量标记为清除。为了容纳100个元素(它可以超过100个元素所需的空间),它仍然拥有它分配的任何东西。然后我们添加了3个值为1的项目。所有这些都是增加大小计数器并重置3个值,底层内存仍然是相同的大小。
v = vector<int>(3, 1);
这确实非常不同之处在于创建的临时额外的载体,同样的事情,而不是有被间歇性的地方计数器为0,然后用一些值3,简单复制计数器大小,然后再执行一个类似于memcpy的操作来复制3个元素。为v分配的底层内存大小仍足以容纳100个整数。
vector<int>(3, 1).swap(v);
这一个是显着不同的。在这种情况下,我们创建一个临时向量,它包含3个元素,它们都被初始化为1.理论上,它仍然可以为100个元素保留足够的内存,但机会很少。然后我们将这个向量与我们自己的交换,让临时被破坏。这有额外的好处,清除我们的旧矢量分配的任何额外内存不在临时。这样做的方式是两个向量(我们的v和临时的)交换的不仅仅是计数器和值,它们还交换缓冲区指针。
这是收缩矢量的唯一方法。
要首先回答第二个问题:vector
将始终为其包含的对象动态分配内存,因此它将最终堆在堆上。
至于哪种重新分配方法更好,我会说你的第一或第二种方法使你的意图最清楚,这是最重要的属性。
您如何使用该任务的矢量成员?
std::vector<int> v(100);
v.assign(3, 1); // this is what you should do.
忽略这些显而易见的事情是多么容易。 – 2011-01-11 19:41:24
它是v.clear()的缩写版本; v.resize(3,1);`具有相同的异常安全问题。 – 2011-01-11 20:05:21
交换将有效地将矢量缩小为3个元素。其他人可能不会。
vector<int> v(100);
v.assign(3, 1);
assert(v.size() == 3);
assert(v.capacity() != 3);
v = vector<int>(3, 1);
// Now, v.capacity() is likely not to be 3.
vector<int>(3, 1).swap(v);
assert(v.capacity() == 3);
其他方法不会在内部调整矢量大小。即使size()成员返回3,它仍将在内存中占用100 * sizeof(int)个字节。尝试显示v.capacity()
以说服自己。
差不多。我们不知道这些情况下所占用的尺寸究竟是多少。许多向量实现预留额外的空间,以便频繁插入不会单独导致重新分配和移动。 – 2011-01-11 19:47:16
在前面的文章中没有提到的一个问题在选择这些替代方案时非常重要。即异常安全。 vector<int>(3, 1).swap(v);
有很强的例外安全保证。表格v = vector<int>(3, 1);
也可以提供这种保证,如果分配实施交换。第一个选择是不安全的:v.clear(); v.resize(3, 1);
- 1. 用String []填充结构体?
- 2. 填充阵列中的物体,在c#
- 3. 如何在运行时填充本体?
- 4. 在二进制物体内填充孔
- 5. 填充物体的物体的长度?
- 6. 如何自动填充/填充单选按钮基于窗体
- 7. MongoDB的实体预填充以避免使用弹簧填充
- 8. 在TextView中加载的图像填充
- 9. 在JAR负载上填充对象池
- 10. 自动填充在页面加载
- 11. 如何在加载后填充UIViewController?
- 12. 在CSS填充背景/文字填充?
- 13. 使用结构的载体来填充的DirectX D3D10_SUBRESOURCE_DATA
- 14. 擦除元素,载体与结构填充
- 15. 填充在Java
- 16. 填充在C++
- 17. 填充在MVC
- 18. 填充重写后填充
- 19. 如何填充您在实体框架中扩展的实体?
- 20. 填充的HashMap中客体从BeanUtilsBean
- 21. 使用NHibernate填充现有实体
- 22. 没有填充3D图形的球体
- 23. 砌体垂直填充前水平
- 24. 的iOS BarButton填充和字体大小
- 25. html窗体和php从mysql填充
- 26. 使用WPF自动填充Windows窗体
- 27. CSS填充和字体问题
- 28. 填充的身体元素增加值
- 29. 使用spock数据表填充物体
- 30. JPA实体关系.persist后不填充()
这是不正确的。无论在哪里声明,原始数组都会分配它们的内存。 `vector`将始终堆分配。 int []!=向量。 – Puppy 2011-01-11 19:30:39