`
javasogo
  • 浏览: 1834216 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

STL实践指南(中)

阅读更多

STL实践指南 Practical Guide to STL
作者:Jeff Bogan
翻译:周翔

(接上篇)

另一种容器——集合(set)

这是微软帮助文档中对集合(set)的解释:“描述了一个控制变长元素序列的对象(注:set中的key和value是Key类型的,而map中的key和value是一个pair结构中的两个分量)的模板类,每一个元素包含了一个排序键(sort key)和一个值(value)。对这个序列可以进行查找、插入、删除序列中的任意一个元素,而完成这些操作的时间同这个序列中元素个数的对数成比例关系,并且当游标指向一个已删除的元素时,删除操作无效。”
而一个经过更正的和更加实际的定义应该是:一个集合(set)是一个容器,它其中所包含的元素的值是唯一的。这在收集一个数据的具体值的时候是有用的。集合中的元素按一定的顺序排列,并被作为集合中的实例。如果你需要一个键/值对(pair)来存储数据,map是一个更好的选择。一个集合通过一个链表来组织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些慢。
下面是一个例子:

//程序:set演示
//目的:理解STL中的集合(set)

#include <string>
#include <set>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
set <string> strset;
set <string>::iterator si;
strset.insert("cantaloupes");
strset.insert("apple");
strset.insert("orange");
strset.insert("banana");
strset.insert("grapes");
strset.insert("grapes");
for (si=strset.begin(); si!=strset.end(); si++)
{ cout << *si << " "; }
cout << endl;
return 0;
}

// 输出: apple banana cantaloupes grapes orange
//注意:输出的集合中的元素是按字母大小顺序排列的,而且每个值都不重复。

如果你感兴趣的话,你可以将输出循环用下面的代码替换:

copy(strset.begin(), strset.end(), ostream_iterator<string>(cout, " "));

.集合(set)虽然更强大,但我个人认为它有些不清晰的地方而且更容易出错,如果你明白了这一点,你会知道用集合(set)可以做什么。

所有的STL容器

容器(Container)的概念的出现早于模板(template),它原本是一个计算机科学领域中的一个重要概念,但在这里,它的概念和STL混合在一起了。下面是在STL中出现的7种容器:

vector(向量)——STL中标准而安全的数组。只能在vector 的“前面”增加数据。
deque(双端队列double-ended queue)——在功能上和vector相似,但是可以在前后两端向其中添加数据。
list(列表)——游标一次只可以移动一步。如果你对链表已经很熟悉,那么STL中的list则是一个双向链表(每个节点有指向前驱和指向后继的两个指针)。
set(集合)——包含了经过排序了的数据,这些数据的值(value)必须是唯一的。
map(映射)——经过排序了的二元组的集合,map中的每个元素都是由两个值组成,其中的key(键值,一个map中的键值必须是唯一的)是在排序或搜索时使用,它的值可以在容器中重新获取;而另一个值是该元素关联的数值。比如,除了可以ar[43] = "overripe"这样找到一个数据,map还可以通过ar["banana"] = "overripe"这样的方法找到一个数据。如果你想获得其中的元素信息,通过输入元素的全名就可以轻松实现。
multiset(多重集)——和集合(set)相似,然而其中的值不要求必须是唯一的(即可以有重复)。
multimap(多重映射)——和映射(map)相似,然而其中的键值不要求必须是唯一的(即可以有重复)。
注意:如果你阅读微软的帮助文档,你会遇到对每种容器的效率的陈述。比如:log(n*n)的插入时间。除非你要处理大量的数据,否则这些时间的影响是可以忽略的。如果你发现你的程序有明显的滞后感或者需要处理时间攸关(time critical)的事情,你可以去了解更多有关各种容器运行效率的话题。

怎样在一个map中使用类?

Map是一个通过key(键)来获得value(值)的模板类。
另一个问题是你希望在map中使用自己的类而不是已有的数据类型,比如现在已经用过的int。建立一个“为模板准备的(template-ready)”类,你必须确保在该类中包含一些成员函数和重载操作符。下面的一些成员是必须的:

  • 缺省的构造函数(通常为空)
  • 拷贝构造函数
  • 重载的”=”运算符

你应该重载尽可能多的运算符来满足特定模板的需要,比如,如果你想定义一个类作为 map中的键(key),你必须重载相关的运算符。但在这里不对重载运算符做过多讨论了。

//程序:映射自定义的类。
//目的:说明在map中怎样使用自定义的类。

#include <string>
#include <iostream>
#include <vector>
#include <map>
using namespace std;

class CStudent
{
public :
int nStudentID;
int nAge;
public :
//缺省构造函数——通常为空
CStudent() { }
// 完整的构造函数
CStudent(int nSID, int nA) { nStudentID=nSID; nAge=nA; }
//拷贝构造函数
CStudent(const CStudent& ob)
{ nStudentID=ob.nStudentID; nAge=ob.nAge; }
// 重载“=”
void operator = (const CStudent& ob)
{ nStudentID=ob.nStudentID; nAge=ob.nAge; }
};

int main(int argc, char* argv[])
{
map <string, CStudent> mapStudent;

mapStudent["Joe Lennon"] = CStudent(103547, 22);
mapStudent["Phil McCartney"] = CStudent(100723, 22);
mapStudent["Raoul Starr"] = CStudent(107350, 24);
mapStudent["Gordon Hamilton"] = CStudent(102330, 22);

// 通过姓名来访问Cstudent类中的成员
cout << "The Student number for Joe Lennon is " <<
(mapStudent["Joe Lennon"].nStudentID) << endl;

return 0;
}


TYPEDEF

如果你喜欢使用typedef关键字,下面是个例子:
typedef set <int> SET_INT;
typedef SET_INT::iterator SET_INT_ITER

编写代码的一个习惯就是使用大写字母和下划线来命名数据类型。

ANSI / ISO字符串

ANSI/ISO字符串在STL容器中使用得很普遍。这是标准的字符串类,并得到了广泛地提倡,然而在缺乏格式声明的情况下就会出问题。你必须使用“<<”和输入输出流(iostream)代码(如dec, width等)将字符串串联起来。
可在必要的时候使用c_str()来重新获得字符指针。

(待续)

分享到:
评论

相关推荐

    STL实践指南 STL实践指南 STL实践指南 STL实践指南

    STL实践指南旨在帮助开发者熟练掌握C++中的标准模板库(STL),它是一组高效、可重用的C++组件,包括容器、迭代器、算法和分配器。STL的核心概念是模板,这是一种元编程技术,允许创建泛型代码,能够处理不同类型的...

    STL实践指南.doc

    STL实践指南旨在帮助开发者熟练掌握C++编程中的标准模板库(STL),这是一个强大的工具集,包含了模板类和函数,极大地增强了C++的效率和灵活性。STL的核心概念包括容器、迭代器、算法和分配器,它们共同构成了高效...

    STL实践指南 Practical Guide to STL

    **STL实践指南——深入理解与应用** STL(Standard Template Library,标准模板库)是C++编程语言中的一部分,它提供了高效且可重用的数据结构和算法。本指南将帮助你快速掌握STL的核心概念,通过实例和源码解析,...

    STL实践指南.rar

    这篇文章从STL的基础知识讲起,循序渐进,逐步深入,涉及到了STL编写代码的方法、STL代码的编译和调试、命名空间(namespace)、STL中的ANSI / ISO字符串、各种不同类型的容器(container)、模板(template)、游标...

    STL实践指南

    STL实践指南是一本面向C++开发者的实用教程,旨在帮助读者掌握STL(标准模板库)的应用。STL是C++编程中的一个重要组件,它提供了高效的数据结构和算法,如容器、迭代器、算法和分配器等。通过学习STL,开发者能够更...

    STL实践指南,初学者的法宝

    总的来说,STL实践指南将引导初学者逐步掌握如何利用STL提高代码效率和可读性。通过学习和实践,你可以更好地理解和应用C++中的这些高级特性,为后续的软件开发打下坚实基础。在阅读和学习过程中,建议结合实际编程...

    STL.rar_C++ STL_C++ STL_STL_STL c++_STL教程

    STL实践指南中通常会涵盖以下内容: - 如何声明和初始化STL容器,以及如何添加、删除元素。 - 迭代器的使用方法,包括递增、递减、比较和解引用。 - 算法的使用,如如何使用sort对容器排序,或使用find查找特定元素...

    STL 电子书合集 中文

    这本书主要关注如何更有效地使用STL,书中通过50个条目介绍了STL使用中的一些常见误区和最佳实践。例如,它探讨了迭代器的生命周期管理,避免不必要的容器复制,以及如何正确使用STL算法来提高性能。Meyers的...

    effective stl 中文 pdf

    STL编程技巧:条款43至条款48提供了编程实践中的技巧,如算法调用代替手写循环、成员函数使用、函数对象使用、避免只写代码以及包含正确的头文件。 编译器错误信息:条款49建议读者学会解读STL相关的编译器错误信息...

    C++STL程序员开发指南源码

    《C++ STL程序员开发指南源码》是一本深入解析C++ Standard Template Library(STL)的书籍源码,旨在帮助开发者更好地理解...通过实践这些源码,开发者可以更好地掌握STL在实际项目中的应用,成为更优秀的C++程序员。

    C++STL程序员开发指南(带目录)

    在阅读《C++ STL程序员开发指南》这本书时,应关注实际示例和练习,通过实践来加深对STL的理解。同时,不断探索STL的高级特性和最新发展,如迭代器适配器、算法的并发版本等,以便在项目中更好地应用STL。 总之,...

    《标准模板库STL指南》

    《标准模板库STL指南》是一本深入探讨C++ Standard Template Library(STL)的书籍,为程序员提供了理解和掌握STL的关键概念与实践方法。STL是C++的一个强大组件,它提供了一系列可重用的类和函数,极大地提高了代码...

    C++STL开发指南

    **C++ STL 开发指南** C++ Standard Template Library(STL)是C++编程语言中的一个核心特性,它提供了一组高效、可重用的数据结构和算法,极大地提升了程序员的生产力,同时也使得代码更加模块化和易于维护。STL的...

    C STL程序员开发指南

    ### C STL程序员开发指南:掌握C++模板技术 在C++编程语言中,模板是一种非常强大的功能,它允许程序员编写通用代码,这种代码可以适用于多种数据类型。这不仅增加了代码的复用性,还提高了程序的灵活性。然而,...

    STL程序员指南(适合作为stl编程手册,查找方便)

    《STL程序员指南》是一本面向实践的编程手册,旨在帮助开发者快速理解和应用STL(Standard Template Library,标准模板库)中的各种工具和概念。STL是C++编程语言中的一个重要部分,它提供了高效且可重用的数据结构...

    STL 入门最全的资料

    这是一篇指导您如何在Microsoft Visual Studio下学习STL并进行实践的文章。这篇文章从STL的基础知识讲起,循序渐进,逐步深入,涉及到了STL编写代码的...不仅仅适合初学者学习STL,更是广大读者使用STL编程的实践指南。

    C++STL程序员开发指南

    在这本《C++ STL程序员开发指南》中,你将深入学习如何有效地使用STL进行C++程序设计。 一、STL的核心组件 1. 容器:STL提供了一系列容器类,如vector(动态数组)、list(双向链表)、deque(双端队列)、set...

Global site tag (gtag.js) - Google Analytics