随笔:
1.pair, map, set, multimap, multiset:
pair
create:
pair
pair
pair
use:
var.first var.second
map
member:
::key_type;key
::mapped_type;value
::value_type;pair
::iterator
insert:
var[key] = xx;
var.insert(pair);3
search:
var.find()iterator
var.count()num=1?0
delete:
var.erase()
set
same as map except:
insert:
no var[key] = xx;
member:
no ::value_type;
::mapped_type == ::key_type;
multimap
same as map except:
delete:
var.erase(search_item);
search:3
sz_type num= authors.count(search_item);
m.equal_range(pair
2. 函数重载, 选择成员实现还是非成员实现?
必须, 成员: = [] () ->
一般情况, 成员: +=, -=, *=, 复合运算. ++,--改变对象状态的.
一般情况, 非成员: + - * /算数 , > == <= 逻辑判断, | &位运算.
总结: 赋值,修改自身的,定义为成员. why?only can find in using.
3. 容器
init:
初始化,复制: vector
初始化,迭代器: vector
原则: 必须能复制, 赋值.
禁止, I/0类: 不能复制,赋值.
默认, 用户类: 有默认复制初始化, 赋值实现.
iterator opera only vector&deque:
iter + n, iter - n : step over add, subtraction.
>, >=, <, <= : compare opera
nosupport eg: list
iterator opera only list&deque:
c.push_front
iterator update:
push
insert
begin, end:
[begin, end)
Relational operators:
, <: less comp {1, 2, 3} < {1, 2, 4, 1, 1}
!=, ==: length&item comp {1, 2, 3} != {1, 2, 3, 1}
user_class: must add opera <, >, !=, == eg: vector
size:
v.max_size()= 1000000000. 不用resize.
程序员保证参数有效
c.erease(p) p
c.erase(b, e) b,e
c.pop_back() c
c.pop_front() c
迭代器失效
--------change---------
c.erease(p) p
c.erase(b, e) b,e
c.pop_back() c
c.pop_front() c
deque: 首部,尾部,插入不失效. 中间插入失效.
--------unchange--------
c.swap()
Vector容器 max_size() & capacity() & reserve()
http://support.microsoft.com/kb/158621/zh-cn
max_size, physical memry can bigest contain size
capacity, now memry malloc size
reserve, first time memry malloc size
vector, deque, list选择
1.
deque: 中间插入删除效率低, 两端插入删除效率高
vector: 插入删除效率低, 查找快
list: 插入删除效率好, 查找要遍历
2.
除非找到使用其他容器的更好理由, 否则vector容器都是最佳选择.
Sring也是一种容器
string包含容器的通用方法: Iterator, find, size...
同时有一些特有方法: compare, insert(pos, s)...
*文件*
模式
app :追加, 并建立文件
binary : 2进制
trunc : 清空
判断打开失败
if (fs.fail()) return;
if (!infile) return;
循环打开文件
避免上一个流遗留的错误状态.
ifstream& open_file(ifstream &in, const string &file){ in.close(); //close file in.clear(); //clear in_status in.open(file.c_str()); //open new return in;}
获取行
方式1: infile >> str
方式2: getline(infile, str)
全部读取
in.read(buff, size)
Virtual
代码
class BookItem{public: BookItem():ISBN(0){}public: int ISBN; virtual void PrintISBN() { cout << "BookItem:" << ISBN << endl; }};class BookMath:public BookItem{public: void PrintISBN() { cout << "BookMath:" << ISBN << endl; }};void virtual_param(BookItem &bi){ bi.PrintISBN();}void virtual_test(){// 1 BookItem bi1; BookMath bm1; BookItem &pbi= bi1;// bi1.PrintISBN();// bm1.PrintISBN(); virtual_param(bm1);}
参数定成父类
virtual
传的父类,就调用父类的。
传的子类,就调用子类的。
非virtual
传的父类,子类,都调用父类
**
****
**默认构造函数****
1. 有了带参构造函数:必须显示声明默认构造函数,必须手动初始化变量.
**
****
**复制控制****
复制构造函数 + 赋值运算符
**
****
继承
继承方式: public, private, protect
默认构造: 默认调用基类构造
构造函数: 显示调用基类构造, 可以设置默认实参
Virtual: 对需要子类修改的函数增加Virtual
-
只能初始化直接基类.
-
只能通过构造函数初始化.不能直接访问基类成员初始化.
复制和赋值不虚构
没有意义.
派生类析构
- 必须显示调用
2.先析构派生类, 再析构基类, 与构造函数相反.
虚析构
-
基类是虚析构, 派生类自动都声明为虚析构
-
即使不释放, 基类也应该有个空虚析构.
派生类构造
-
派生, 基类都有合成默认构造
-
制定构造函数,先构造基类, 再构造子类.
合成操作符
即: 系统提供的操作符
合成默认构造函数
合成复制构造函数
合成赋值操作符
**类组成****
**#TODAY QUESTION****
-
析构函数何时用, 怎么用?
-
虚析构函数怎么用?
-
赋值函数, 赋值构造函数, 析构函数虽然, 类自动合成, 但是何时需要自己手动写? 是不是每个类都要写?
-
构造函数, 只初始化部分变量的情况, 其他变量是否会默认初始化为0?
-
类的设计. 设计成什么样子, 哪些成员必须有, 哪些程序不必须有.
**
****
#Record
vector
list
原文链接: https://www.cnblogs.com/oleeceo/archive/2010/12/21/1913083.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/19074
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!