[C++标准程序库的问题] 在删除操作很多的情况下,应该选择什么样的容器?

如题所述

第1个回答  2020-04-05
引用~0&1~的,这就是一个好答案!!!
按照标准程序库的说明,当删除/插入只发生在容器的尾部时,应该使用vector;当删除/插入只发生在容器的首/尾部时,应该使用deque;当删除/插入操作很多,而且删除/插入不是只在容器的首尾,这时应该选择list。
  但是这里也有一个问题,在使用list时,由于其迭代器只能一次移动一个位置,在有大量删除的操作时,需要大量的迭代器移动操作,因此使用list的效率会很低;list的另一个缺点是,占用空间要比同等容量大小的vector要大,这是由于list的实现需要指针,每个元素就多比vector中的元素多两个指针(双向链表),因此在每个元素都很小(几个字节),而且元素数量很大时,使用list就非常浪费空间了。
  如果使用vector,那么删除中间元素会导致大量的元素移动操作,效率也不高,为了解决这个问题,我们可以这样作:使用vector容器,但是不直接删除元素,而是再申请一个临时vector,将原来vector中未删除的有用元素依次加入/保存到临时vector,然后用这个临时vector替换原来的vector,如果实现知道要删除的元素的个数,那么可以事先预留临时vector的空间,再将有用元素存到临时vector中,代码如下:
#include
<vector>
using
namespace
std;
vector
myVec;

//
myVec的初始化以及其它操作
vector
tempVec;
//
删除myVec中的num个元素
tempVec.reserve(
myVec.size()
-
num
);
//
预留临时vector的空间
for
(
;;
)
{
将myVec中的有用元素存到tempVec中;
}
myVec.swap(
tempVec
);
//
myVec的容量等于或稍大于myVec.size()

//
其它操作
第2个回答  2019-10-04
按照标准程序库的说明,当删除/插入只发生在容器的尾部时,应该使用vector;当删除/插入只发生在容器的首/尾部时,应该使用deque;当删除/插入操作很多,而且删除/插入不是只在容器的首尾,这时应该选择list。
  但是这里也有一个问题,在使用list时,由于其迭代器只能一次移动一个位置,在有大量删除的操作时,需要大量的迭代器移动操作,因此使用list的效率会很低;list的另一个缺点是,占用空间要比同等容量大小的vector要大,这是由于list的实现需要指针,每个元素就多比vector中的元素多两个指针(双向链表),因此在每个元素都很小(几个字节),而且元素数量很大时,使用list就非常浪费空间了。
  如果使用vector,那么删除中间元素会导致大量的元素移动操作,效率也不高,为了解决这个问题,我们可以这样作:使用vector容器,但是不直接删除元素,而是再申请一个临时vector,将原来vector中未删除的有用元素依次加入/保存到临时vector,然后用这个临时vector替换原来的vector,如果实现知道要删除的元素的个数,那么可以事先预留临时vector的空间,再将有用元素存到临时vector中,代码如下:
#include
<vector>
using
namespace
std;
vector
myVec;

//
myVec的初始化以及其它操作
vector
tempVec;
//
删除myVec中的num个元素
tempVec.reserve(
myVec.size()
-
num
);
//
预留临时vector的空间
for
(
;;
)
{
将myVec中的有用元素存到tempVec中;
}
myVec.swap(
tempVec
);
//
myVec的容量等于或稍大于myVec.size()

//
其它操作
这只是我目前总结的几个问题,以后遇到问题随时解决,随时总结。

...在删除操作很多的情况下,应该选择什么样的容器?
按照标准程序库的说明,当删除\/插入只发生在容器的尾部时,应该使用vector;当删除\/插入只发生在容器的首\/尾部时,应该使用deque;当删除\/插入操作很多,而且删除\/插入不是只在容器的首尾,这时应该选择list。但是这里也有一个问题,在使用list时,由于其迭代器只能一次移动一个位置,在有大量删除的操作时...

microsoft visual c++电脑里有很多个版本,可以卸载吗?卸载哪几个?
如果要卸载的话可以选择9.0.0之前版本的Visual C++,因为此版本之前的库绝大多数是为2010年之前的软件提供API,若卸载了不会影响绝大多数近期更新的软件,但是不否认有新软件还需要的特例,所以只有在必须的时候才选择卸载。程序编译版本不一样需要的运行组件版本也不一样,所以不建议删除,但是删除之后...

什么是容器
回答:首先,我们必须理解一下,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种“对象”还包含了一系列处理“其它对象”的方法,因为这些方法在程序的设计上会经常...

c++类中的资源如何管理?
在C++中,建议优先使用封装良好、性能优化的标准库容器(如vector、list、string),它们已内建了内存管理机制,用户可以将它们视为值类型,无需额外内存管理代码。在函数参数传递时,使用常量引用可避免不必要的内存复制。多态场景中,类如function、any等可能需要额外的封装机制,通过构造函数和赋值重载提供...

C++语法高手进
32. 两个主要的顺序容器是list和vector,另外一个顺序容器是deque;两个主要的关联容器是map和set。33. 选择顺序容器类型的一些准则:(1)随机访问,vector比list好得多;(2)已知道元素的个数,则vector比list强;(3)如果不只是在容器两端插入和删除元素,则list比vector强很多;(4)除非需要在容器首部插入和删除元素,则...

C++的学习方法!~
在结合基于对象和泛型设计这两种抽象设计模式的技术上诞生的工业产品就是---STL。 (二)书的诱惑 《C++程序设计语言》:如果你只买一本C++书,这本就是你的选择,作者Bjarne就是让你做出这样选择的全部理由,没有人能比他更了解什么样才是真正的使用C++编程了,有人说到这本书语言晦涩,或者对与初学者此书不适合,...

深入理解STL库
- **优势**:高效插入、删除操作。Map\/Multimap\/Set\/Multiset - **底层**:红黑树。- **特性**:按键值排序,红黑树特性。Unordered_map\/unordered_set\/unordered_multimap\/unordered_multiset - **底层**:哈希表,O(1)查找时间。- **特性**:无序排列。总结 理解STL库中的这些概念和组件,将...

命名空间的含义是什么?
空间名::变量 方法一使用Teacher using namespace NameSpaceB::NameSpaceC; Teacher t1 = {"aaaaa", 25}; 方法二使用Teacher NameSpaceB::NameSpaceC::Teacher t2 = {"bbbbbb", 22}; return0;}另外,std是c++标准命名空间,c++标准程序库中的所有标识符都被定义在std中,比如标准库中的类ostream 、istream...

Boost程序库完全开发指南:深入C++“准”标准库(修订版)目 录_百度知 ...
Boost程序库开发指南,深入探索C++“准”标准库的全面教程,为你揭示各个方面的精髓。首先,第0章是导论,为读者提供了对整个库的初步了解和背景介绍。第1章详述Boost库的概述,包括其设计理念和应用场景,为后续章节打下基础。接着,第2章深入探讨时间与日期处理,帮助你有效管理时间和日期操作。第3章...

【C++ 迭代器】理解 C++ 迭代器:标准与自定义容器中的 begin() 和 c...
迭代器是C++的灵魂,方便高效地访问和操作容器元素,无需关注底层实现细节。正确使用迭代器以提高代码质量和安全性 通过了解begin()和cbegin()的区别和应用场景,选择和使用适当的迭代器。结论 (Conclusion)深入探讨C++迭代器,从基本概念到自定义容器实现,再到最佳实践,掌握迭代器机制。迭代器在C++编程中...

相似回答
大家正在搜