C++ STL容器的选择
RT,有什么参照吗,比如我现在有一个结构体,我不想用链表,想用容器代替,用哪种容器好,各个容器的优缺点是什么,全面点,各位大湿有时间就多写点,给个好一点的网址也行(主要讲...
RT,有什么参照吗,比如我现在有一个结构体,我不想用链表,想用容器代替,用哪种容器好,各个容器的优缺点是什么,全面点,各位大湿有时间就多写点,给个好一点的网址也行(主要讲容器怎么选择的),谢谢了
展开
2个回答
展开全部
一些常见的容器选择问题
? 你是否需要在容器的任意位置插入新元素?
如果需要,就选择序列容器;关联容器是不行的。
? 你是否关心容器中的元素是如何排序的?
如果不关心,则哈希容器是一个可行的选择方案;否则,你要避免哈希容器。
? 你选择的容器必须是标准C++的一部分吗?
如果必须是,就排除了哈希容器、slist和rope。
? 你需要哪种类型的迭代器?
如果它们必须是随机访问迭代器,则对容器的选择就被限定为vector、deque和string。或许你也可以考虑rope。如果要求使用双向迭代器,那么你必须避免slist以及哈希容器的一个常见实现。
? 当发生元素的插入或删除操作时,避免移动容器中原来的元素是否很重要?
如果是,就要避免连续内存的容器。
? 容器中的数据的布局是否需要和C兼容?
如果需要兼容,就只能选择vector容器。
? 元素的查找速度是否关键的考虑因素?
如果是,就要考虑哈希容器,排序的vector,和标准关联容器 --- 或许这就是优先顺序。
? 如果容器内部使用了引用计数技术(reference counting),你是否介意?
如果是,就要避免使用string,因为许多string的实现都是用了引用计数。Rope也需要避免,因为权威的rope实现是基于引用计数的。当然,你需要某种表示字符串的方法,可以考虑vector<char>。
? 对插入和删除操作,你需要事务语义(transactional semantics)吗?也就是说在插入和删除操作失败时,你需要回滚的能力吗?
如果需要,你就要使用基于节点的容器。如果对多个元素的插入操作需要事务语义,则你需要选择list,因为在标准容器中,只有list对多个元素的插入操作提供了事务语义。
? 你需要使迭代器、指针和引用变为无效的次数最少吗?
如果是这样,就要使用基于节点的容器,因为对这类容器的插入和删除操作从来不会使迭代器、指针和引用变为无效(除非它们指向了一个你正在删除的元素)。而针对连续内存容器的插入和删除操作一般会使指向该容器的迭代器、指针和引用变为无效。
? 如果序列容器的迭代器是随机访问迭代器类型,而且只要没有删除操作发生,且插入操作只发生在容器的末尾,则指向数据的指针和引用就不会变为无效,这样的容器是否对你有帮助?
这是非常特殊的情况,但如果你面对的情形正是如此,则deque是你所希望的容器。(有意思的是,当插入操作仅在容器末尾发生时,deque的迭代器有可能变为无效。deque是唯一的迭代器可能会变为无效而指针和引用不会变为无效的STL标准容器。)
转自CSDN
? 你是否需要在容器的任意位置插入新元素?
如果需要,就选择序列容器;关联容器是不行的。
? 你是否关心容器中的元素是如何排序的?
如果不关心,则哈希容器是一个可行的选择方案;否则,你要避免哈希容器。
? 你选择的容器必须是标准C++的一部分吗?
如果必须是,就排除了哈希容器、slist和rope。
? 你需要哪种类型的迭代器?
如果它们必须是随机访问迭代器,则对容器的选择就被限定为vector、deque和string。或许你也可以考虑rope。如果要求使用双向迭代器,那么你必须避免slist以及哈希容器的一个常见实现。
? 当发生元素的插入或删除操作时,避免移动容器中原来的元素是否很重要?
如果是,就要避免连续内存的容器。
? 容器中的数据的布局是否需要和C兼容?
如果需要兼容,就只能选择vector容器。
? 元素的查找速度是否关键的考虑因素?
如果是,就要考虑哈希容器,排序的vector,和标准关联容器 --- 或许这就是优先顺序。
? 如果容器内部使用了引用计数技术(reference counting),你是否介意?
如果是,就要避免使用string,因为许多string的实现都是用了引用计数。Rope也需要避免,因为权威的rope实现是基于引用计数的。当然,你需要某种表示字符串的方法,可以考虑vector<char>。
? 对插入和删除操作,你需要事务语义(transactional semantics)吗?也就是说在插入和删除操作失败时,你需要回滚的能力吗?
如果需要,你就要使用基于节点的容器。如果对多个元素的插入操作需要事务语义,则你需要选择list,因为在标准容器中,只有list对多个元素的插入操作提供了事务语义。
? 你需要使迭代器、指针和引用变为无效的次数最少吗?
如果是这样,就要使用基于节点的容器,因为对这类容器的插入和删除操作从来不会使迭代器、指针和引用变为无效(除非它们指向了一个你正在删除的元素)。而针对连续内存容器的插入和删除操作一般会使指向该容器的迭代器、指针和引用变为无效。
? 如果序列容器的迭代器是随机访问迭代器类型,而且只要没有删除操作发生,且插入操作只发生在容器的末尾,则指向数据的指针和引用就不会变为无效,这样的容器是否对你有帮助?
这是非常特殊的情况,但如果你面对的情形正是如此,则deque是你所希望的容器。(有意思的是,当插入操作仅在容器末尾发生时,deque的迭代器有可能变为无效。deque是唯一的迭代器可能会变为无效而指针和引用不会变为无效的STL标准容器。)
转自CSDN
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询