对象-C++ primer 里面STL容器set的insert操作问题。。。

问题描述

C++ primer 里面STL容器set的insert操作问题。。。

在C++primer 5th 的13.4节里面有个类的定义是这样的:
class Message
{
friend void swap(Message&, Message&);
friend class Folder;
public:
//folders被隐式初始化为空集合
explicit Message(const string &str=""):contents(str){}
//拷贝控制成员,用来管理指向本Message的指针
Message(const Message&); //拷贝构造函数
Message& operator=(const Message&); //拷贝赋值运算符
~Message(); //析构函数
//从给定的Folder中添加/删除本Message
void save(Folder&);
void remove(Folder&);
//显示有几个Message对象
void show();
private:
string contents; //实际消息文本
set folders; //包含本Message的folder
//拷贝构造函数,拷贝赋值运算符合析构函数所使用的工具函数
//将本message添加到指向参数的folder中
void add_to_Folders(const Message&);
//从folders中的每个Folder中删除本Message
void remove_from_Folders();
//向folders添加和删除
void addFldr(Folder *f){folders.insert(f);}
void remFldr(Folder *f){folders.erase(f);}
};
其中的成员函数 void save(Folder&);定义为:
void Message::save(Folder &f)
{
folders.insert(&f); //将给定Folder添加到我们的Folder列表中
f.addMsg(this); //将本Message添加到f的Message中
}
请教下大神,folders不是set< Folder的指针> 类型么,为什么在函数里面folders可以insert像Folder& 的类型(不是应该insert像 Folder的指针的类型)?

解决方案

&f就是Folder类型指针。至于Folder &f表示save的形参是引用,引用则只是变量的别名,表示的仍然是值。因此&f表示的是f的地址。

时间: 2024-05-22 09:41:45

对象-C++ primer 里面STL容器set的insert操作问题。。。的相关文章

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

ACM STL容器和算法

1.4      STL 的组成 STL有三大核心部分:容器(Container).算法(Algorithms).迭代器(Iterator),容器适配器(container adaptor),函数对象(functor),除此之外还有STL其他标准组件.通俗的讲: 容器:装东西的东西,装水的杯子,装咸水的大海,装人的教室--STL里的容器是可容纳一些数据的模板类. 算法:就是往杯子里倒水,往大海里排污,从教室里撵人--STL里的算法,就是处理容器里面数据的方法.操作. 迭代器:往杯子里倒水的水壶,

【温故而知新】C和C++5:STL容器技术综述

容器类是可以包含其他对象的类.STL中提供的较为常用的容器类有向量.链表.队列.集合和图等,每一种容器类都是一个模板,可以包含各种类型的对象.这些容器可以分为序列式和关联式两大类. 序列式容器主要有: 1.vector:向量类,可以认为是一种容量可变的数组,可以提供对元素的随机访问,而且可以在序列尾部快速插入和删除数据,并且在需要的时候可以方便地改变容器的大小: 2.list:双向链表类,不支持随机访问的数组类,遍历链表的元素需要从某个端点开始向前或向后遍历: 3.queue:队列,实现先进先出

c++ STL容器总结之:vertor与list的应用_C 语言

STL提供六大组件,彼此可以组合套用 1.容器(containers):各种数据结构,如vertor,list,deque,set,map.从实现的角度来看,STL容器是一种class template 2.算法(algorithms):各种算法如sort,search,copy,earse.STL算法是一种 function template. 3.迭代器(iterators):扮演容器与算法之间的胶合剂,是所谓的"泛型指针".所有STL容器都有自己的专属的迭代器. 4.仿函数(fu

C++语言 STL容器list总结_C 语言

在使用std::list<>链表时,难免会对数据进行添加删除操作.而遍历链表则有两种方式:通过索引访问,象数组一样处理:通过std::list<>::iterator链表遍历器进行访问 STL 中的list 就是一 双向链表,可高效地进行插入删除元素. list不支持随机访问.所以没有 at(pos)和operator[]. list 对象list1, list2 分别有元素list1(1,2,3),list2(4,5,6) .list< int>::iterator

STL容器与拷贝构造函数

所有容器提供的都是"value语意"而非"reference语意".容器内进行元素的安插操作时,内部实施的是拷贝操作,置于容器内.因此STL容器 的每一个元素都必须能够拷贝.---<<C++标准程序库>> 侯捷.孟岩译 p144页原文  以vector为例,往Vector中(实际上所有STL容器都是这样)放元素,Vector会调用元素类的拷贝构造函数生成的副本,当 Vector走出生存期时(),会自动调用其中每个元素的析构函数.比如,如果 v

c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

c++ stl集合set介绍    c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素 2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数 3) 元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同) set模板原型://K

怎样删除STL容器中的元素

怎样删除STL容器中的元素 去除一个容器中有特定值的所有对象: 如果容器是vector.string或deque,使用erase-remove惯用法. 如果容器是list,使用list::remove. 如果容器是标准关联容器,使用它的erase成员函数. 去除一个容器中满足一个特定判定式的所有对象: 如果容器是vector.string或deque,使用erase-remove_if惯用法. 如果容器是list,使用list::remove_if. 如果容器是标准关联容器,使用remove_c

c++-以下代码对stl容器DataMap进行了多少次搜索

问题描述 以下代码对stl容器DataMap进行了多少次搜索 这是一道笔试题,想了好久.找了好久也没有个确切的答案,求大神指导 struct Data{ Data():value(0){} int value; } std::map<int, Data> DataMap; void RemoveData(int key){ assert(DataMap.empty() == false); if(DataMap[key].value > 0) --DataMap[key].value;