`
evasiu
  • 浏览: 168995 次
  • 性别: Icon_minigender_2
  • 来自: 广州
博客专栏
Fa47b089-e026-399c-b770-017349f619d5
TCP/IP详解卷一>阅读...
浏览量:12524
社区版块
存档分类
最新评论

c++ premier -- 容器

 
阅读更多

 呵呵,两个星期没有更新博客了。这两个星期基本一心一意都在做实验室的事,现在终于把算法写完了,测试效果也不错,总算有了自己原创的算法出来。不负我两个星期望着c++ premier却不敢翻开来看。今天早上把容器这两章给看了,我想整理一下,然后自己把它后面的综合应用给实现了。看完这一part就开始进入类方面的设计了,其实看这本书的目的就是要看类,然后实现一些数据结构。只剩两个星期了,希望能把这个目标完成,回家希望可以继续学法语吧。

 

有关顺序容器,指的是窗口内的元素按其位置存储和访问。顺序容器的元素排列次序与元素值无关,而是由元素添加到窗口里的次序决定。标准库定义了三种顺序容器类型:vector, list和deque。

适配器是根据原始容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型。顺序容器适配器包括stack、queue和priority_queue类型。

容器所能盛放的元素的类型必须满足以下两个约束:

1. 元素类型必须支持赋值运算

2. 元素类型的对象必须可以复制。

顺序容器这一章的主要内容包括容器的初始化、跟容器关联的迭代器、容器相关的操作以及顺序容器的适配器。

 

1. 容器的初始化

 

 

2. 容器的迭代器及迭代器的范围

 迭代器所提供的操作包括引用(*iter)、解引用(iter->mem)、自增自减、比较相等或不等。

对于vector、deque中的迭代器,还能像指针那样,进行如下操作:iter+n、iter-n、iter1 += iter2、iter2 -= iter2,以及比较大小。

迭代器的范围:[begin, end),是一个左闭合区间。

 

3. 顺序容器的操作



 这里不大理解的是value_type、reference、const_reference这三个类型别名有什么意义呢?

 

每种顺序容器都提供了类似于如下的操作:

1. 添加元素 insert、push_back(t)、list和deque的push_front(t),insert可在指定位置添加一个、一段、n个元素。

2. 删除元素 erase、clear、pop_back以及list和deque的pop_front。

3. 设置容器大小 size、max_size、empty、resize

4. (如果有的话)获取容器内的第一个和最后一个元素。c.begin()、c.end()返回指向首尾的迭代器,而c.front()、c.back()返回首尾的元素。

5. 元素访问,除了c.front()、c.back()之外,还有下标操作、c.at()操作可以随机访问元素,不过只限于vector和deque。

6. 赋值与swap。swap让我意识到,容器的迭代器是跟容器的元素绑定在一起的,例如:

vector<int> vec1, vec2;
vector<int>::iterator iter1, iter2;
for( int i=0; i<10; i++ )
     vec1.push_back(i);
for( int i=0; i<15; i++ )
      vec2.push_back(i+15);
//iter1指向vec1的第一个元素,iter2指向vec2的第二个指针
iter1 = vec1.begin();
iter2 = vec2.begin();
//vec1与vec2的内容交换,iter1指向vec2的第一个元素,iter2指向vec1的第一个元素
vec1.swap(vec2);

7. 所有的容器还都支持关系操作符

 

4. 容器适配器

适配器以顺序容器为基础设备,提供了另外一套特别的操作来使用数据结构,因此适配器的初始化除了元素类型外,还需要一个顺序容器。

默认的stack和queue都基于deque容器实现,而priority_queue则在vector容器上实现。在创建适配器时,通过将一个顺序容器指定为适配器的第二个类型实参,可以覆盖其关联的基础容器类型:

//deq中的元素复制到stk中来。deq 是一个deque
stack<int> stk(deq); 
//基础容器为vector的空stack
stack< string, vector<string> > str_stk;
//将svec中的元素复制到stack中来
stack< string, vector<string> >str_stk2(svec);

对于给定的适配器,其关联的容器必须满足一定约束条件。stack适配器所关系的基础容器可以是任意一种顺序容器类型,因此stack可以建立在vector、list或deque容器之上。而queue适配器要求其关联的基础容器必须提供pos_front(书里写的是push_front,但其实应该是指的pop_front)运算,因此只能建立在list、queue容器上,而不能建立在vector容器上。priority_queue适配器要求提供随机访问功能,因此可以建立在vector或deque上,而不能建立在list上。

 

关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器通过元素在容器中的位置顺序存储和访问元素。

 

5. pair类型

pair类型有两个数据成员,分别为first、second,map中的元素便是pair。可以通过makpair( first, second)来成生一个pair。如:

pair<string, string> author;
string first, last;
while( cin>>first>>last ){
     author = makepair( first, last );
     //process author
}

 

6. map类型

首先看一下map中定义的一些类型。



 

map比较神奇的地方在于可以用下标操作来获取元素。例如下面一段代码:

map<string, int> word_count;
word_count["anna"] = 1;

 将发生以下事情:

(1)在word_count中查找键为"anna"的元素,没有找到(word_count目前是个空map);

(2)生成一个新的键-值对,它的键是const string类型的对象,保存anna,而它的值 则采用值初始化,即int的值初始化为0;

(3)将这个新的键-值对插入到word_count中;

(4)读取新插入的元素,并将它的值赋为1.

使用下标存在一个很危险的副作用:如果该键不在map容器中,那么下标操作会插入一个具有该键的新元素。而使用insert成员则可避免使用下标操作所带来的副作用。

insert单个pair的时候,其返回值为一个pair,该pair的first成员为指向插入元素的map的迭代器,second成员为一个布尔变量,标识是否添加了新的键。

insert还可以添加一段由迭代器指示的范围,返回void类型。

 

 

7. set类型

set类型只是单纯的键的集合,当我们只想知道一个值是否存在时,用set容器是最适合的。在set中,每个键只能出现一次。

 

8. multimap和multiset

在map或set容器中查找一个元素很简单——该元素要么在要么不在容器中,但对于multimap和multiset,某键对应的元素可能出现多次,要找出与某键对应的所有元素,有三种策略可以解决,而且这三种策略都基于一个事实——在multimap中,同一个键所关联的元素必须相邻存放。

策略1:使用find和count操作(假设contactor是一个以人名为键,电话号码为值的map)

string search_item( "eva xiao" );
typedef multimap<string, string>::size_type sz_type;
sz_type entries = contactors.count(search_item);
multimap<string, string>::iterator iter = contactors.find(search_item);
for( sz_type cnt = 0; cnt!=entries; ++cnt, ++iter )
    cout<<iter->second<<endl;

 策略2、3:使用返回迭代器的关联容器操作



 

也就是说,可以使用lower_bound(k)各upper_bound(k)来确定包含健k的范围,或者直接使用equal_range(k)。

  • 大小: 53.2 KB
  • 大小: 46.2 KB
  • 大小: 28.5 KB
  • 大小: 30.1 KB
分享到:
评论

相关推荐

    C++ Premier顺序容器思维导图总结

    附件的内容为使用思维导图XMind总结C++标准库的顺序容器,通过把C++ Premier顺序容器翔实的放在一张图片上,可以非常方便的梳理思路,在工作中也能提高工作效率。灵活的使用容器是C++开发人员必须具备的技能

    C++ premier中文版 电子书

    4. **STL(标准模板库)**:STL是C++标准库的一部分,包含容器(如vector、list、set等)、迭代器、算法和分配器等组件,极大地提升了开发效率。 5. **异常处理**:C++通过异常处理机制来处理程序运行时的错误,...

    C++ Premier第四版中文英文源代码

    7. **标准库的使用**:C++标准库包含了许多有用的容器(如vector、list、set)、算法(如排序、搜索)和实用工具(如字符串、智能指针)。学习如何有效利用标准库是提高编程效率的关键。 8. **实践项目**:C++ ...

    c++ premier 第四版 课后习题答案+所有源代码

    掌握模板的使用,包括函数模板和类模板,以及STL中的容器、迭代器和算法;还会接触到异常处理和命名空间等高级话题。 C++ Primer 的习题答案可以帮助读者解决学习过程中的困惑,避免在探索答案时走弯路,节省宝贵的...

    C++ Premier 中英文对照chm版

    4. **STL(Standard Template Library)**:C++的标准模板库提供了容器(如vector、list)、迭代器、算法和函数对象等,极大地提高了C++程序员的生产力。 5. **异常处理**:C++的异常处理机制使得程序能够优雅地...

    C++Primer(中文版第4版)+源码+习题答案完整版.7z

    《C++ Primer(中文版第4版)》是学习C++编程的重要参考资料,它由Lippman、Lajoie和 Moo三位资深C++专家撰写,深入浅出地介绍了C++语言的基本概念和技术。这本书旨在帮助读者理解C++的核心特性,并掌握如何有效地使用...

    XMind总结C++关联容器

    本资源是使用XMind总结C++中关联容器的使用,关联容器包括map,set,multimap,multiset。内含相关的操作及构造函数,代码片段演示

    The C++Standard Library(2nd).pdf

    此外,本书还适合与《C++ premier(5th)》配合使用,意味着它可能涉及了C++的基础知识和一些高级特性,使得读者在掌握了基础C++编程技能后,能够进一步深化对标准库的理解和应用。 在描述中还提到,这本书不仅是一...

    [Premier]C++_Programming_For_The_Absolute_Beginner.zip

    同时,标准模板库(STL)提供了容器(如vector、list、set、map)、算法和迭代器,极大地简化了编程工作。 异常处理是C++中处理错误和异常情况的方式,通过try、catch和throw关键字来实现。学习如何正确地使用异常...

    IPL_Analyser_Cpp

    【IPL_Analyser_Cpp】是一个基于C++的项目,专门用于分析印度板球超级联赛(Indian Premier League,简称IPL)的数据。这个项目可能包含解析比赛数据、统计球员表现、评估球队策略等多个功能。从项目的命名来看,...

Global site tag (gtag.js) - Google Analytics