cppPrimer2

来源:互联网 发布:catia软件培训 编辑:程序博客网 时间:2024/06/01 12:25
七.函数
1.编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组元素的类型是否匹配,而不会检查数组的长度。
2.不需要修改形参时,用const修饰,用引用&.
3.return void;是隐式存在在最后的。
4.千万不要返回局部对象的引用或者指针。
5.main函数不能调用自己。
6.默认实参的指定只能有一次;在声明时指定,实现的时候不能指定。
7.内联函数,避免函数调用开销,直接会嵌入在调用者代码调用处。
8.内联函数应该在头文件中定义,这点与其他函数是不一样的。
9.重载函数貌似c不支持,c++值所以支持是因为编译器会把他们到最后改成不同的函数名的
1.函数的声明应该放在头文件中。局部的声明是一种不明智的选择。
2.重载函数的默认实参应该从最右边开始
3.typedef bool (*cmpFcn)(const string &, const string &); 这句话把cmpFcn定义为一个函数指针; cmpFcn ptr;这样就方便定义一个函数指针了。函数指针只能通过同类函数,同类函数指针,0,来初始化或赋值。
(*ptr)("","");如此调用
4.返回指向函数的指针: int (*ff(int))(int *, int ); 返回一个指针,这个指针指向一个函数类型;
5.bool *pf(const string , string); 一个返回bool指针类型的函数 
  bool (*pf)(const string, string); 一个函数的指针,他所指向的函数是返回bool类型
八.标准IO库
1.面向对象的标准库,istream 读,ostream 写,>> << ,wistream,wostream cin cout wcin wcout...
2.注意,这些流对象是不可以复制的(形参,返回值,赋值,拷贝构造,初始化),只能使用流对象的指针或者引用来传递。
3.这一章懒得看
第二部分.容器和算法
九.顺序容器 vector list deque双端队列,顺序容器适配器 stack queue priority_queue(容器只定义了少量的操作,大多数由算法库提供操作)
1.适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型。
2.
vector 支持快速随机访问
list   支持快速插入/删除
deque  双端队列
适配器
stack  后劲显出栈
queue  先进后出队列
priority_queue 有优先级管理的队列
3.如果迭代器begin()end()相等,说明木有元素。注:使用失效的迭代其会导致运行时错误。
4.注意:任何insert,push操作都可能导致迭代其失效,必须确保每次迭代器循环后都得到更新。
5.标准库算法,得包含algorithm头文件
 find算法:例如:list<string>::iterator iter = find(slist.begin(), slist.end(), value); slist.erase(iter);
 list.clear(); list.erase(list.begin(), list.end()); 删除所有元素
6.交换元素list.swap(b);
7.重置元素:list.assign(b,e); 此方法先把里面的值给删除,然后再吧参数作为新元素的插入。
特点:assign支持元素类型不同的不同容器间的数据赋值,但是相互兼容,则其赋值运算必须使用assign函数;即可以吧vector<char*>赋给string类型的list容器。
8.vector容器的自增长:实际上vector所分配的空间比我们初始的时候多一些的。2倍吧好像是。
9.vector capacity():重新分配空间之前能够存储的元素总数。 reserve()告诉vector应该预留多少个元素的存储空间。
例如:ver size:24 capacity:32,   
    ver.reserve(50);
例如:ver size:24 capacity:50,   vector只在没有空间存储时开会重新分配空间:以加倍当前容量的分配策略实现重新分配方式。
1.各容器的优缺点
 vector deque容器提供了对元素快速随机访问,但是代价是插入和删除时比尾部插入和删除开销更大。-----------适合随机访问,不适合快速插入和删除
 list的随机访问开销较大,但是能够快速的插入和删除。-------------适合插入删除,不适合随机访问
2.如果无法确定使用哪种容器的时候,我们尽量使用迭代其来代替下标操作,这样以后更换容器也是很方便的。
3.sting的初始化一定要有null结尾。
4.string可以使用insert来插入数据的。substr,append,replace,find , find_first_of, find_last_not_of,split
5.默认情况下stack建立在deque容器上来实现的。虽然他还可以通过vector,deque,来实现.push() pop()
  而priority_queue则是在vector容器上实现的。(也可以在deque):标准库默认使用<操作符来确定他们之间的优先级关系。
  而queue只能建立在list容器上,不能建立在vector,因为他需要提供push_front.
十章:关联容器:通过key来存储和读取元素。按照键的顺序访问。<来排序的;所以说建类型必须定义<操作符,而且该操作符应能正确的工作。
1.map set multimap multiset
set:有效的存储不同值的集合:检查一个对象是否存在其中过。
map:适合用于需要存储每个键所关联的值的情况
pair类型:简单的标准库类型,pair类,可以直接访问其数据成员,其成员都是公有的,分别命名为first second
pair<string, int> a = make_pair("123" , 1);
2.map的value_type就是pair类型哦。其键值为const,所以建不能修改,值是可以修改的。
3.map.insert(make_pair("abc",1)); 使用下标操作符所带来的副作用.不必要的初始化:如果试图插入的元素所对应的建已在容器中,则insert将不做任何操作。具体用法需要那个
4.map.count() 出现次数 0 or 1, map.find() 返回迭代其 否则 ==end(),
5.set存储的仅仅是键,而没有所关联的值。和map一样,set容器存储的建也必须是唯一,而且不能修改的。set中的建也是const,只能读不能写,与map中的建是一样的。set可以用于创建单词排除集,非法单词的排除。
6.multimap multiset 操作与map set大致相同 ,唯一一点就是 multimap不支持下标运算。只能用insert( make_pair("12",3) );insert( make_pair("12",4) ); erase("12");
查找:
string a("12");
size_type entries = mmap.count(a);
multimap<string,string>::iterator iter = mmap.find(a); 找到第一个拥有该建的实例;
for(size_type i = 0; i != entries; ++i,++iter)  :在multimap中,同一个建所关联的元素必然相邻存放。所以才能够的带第一个之后,如此遍历查找出所有相关的值。
  cout << iter->second << endl;


7.multimap另一种方法来实现一个key的多个值的获取:lower_bound() upper_bound()
string a("12");
xxx::iterator  beg = mmap.lower_bound(a);
xxx::iterator  end = mmap.upper_bound(a);
while( beg != end)
{
cout<< beg->second<<endl;
++beg;
}


8.multimap另一种方法来实现一个key的多个值的获取:equal_range()
pair<迭代其1, 迭代其2> pos = mmap.equal_range(a);
while(pos.first != pos.second)
{
cout << pos.first->second <<endl;
++pos.first;
}
十一章:泛型算法