c++基础[..ing]

随笔:

1.pair, map, set, multimap, multiset:

pair

create:    

pair<type, type> var(param, param) ;   3

pair<type, type> var = make_pair(param, param);

   pair<type, type> var = pair<type, type>(param, param);

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<authors_it, authors_it>);

 

2.  函数重载, 选择成员实现还是非成员实现?

必须, 成员: = [] () ->

一般情况, 成员: +=, -=, *=, 复合运算.     ++,--改变对象状态的.

一般情况, 非成员: + - * /算数 , > == <= 逻辑判断, | &位运算.

总结: 赋值,修改自身的,定义为成员.     why?only can find in using.

 

3. 容器

init:

初始化,复制:  vector<type1> ivec1(ivec2)  , 必须相同的容器类型和元素类型: ivec2必须是vector<type1>

初始化,迭代器: vector<type1>ivec1(arr, arr+6), vector<type1>ivec1(itora1, itora1+6),   不需要相同的容器类型和元素类型, 兼容即可: arr类型double->vector<int>

<element> constraint:

原则: 必须能复制, 赋值.

禁止, 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<user_class>  a, b; 

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

1. 只能初始化直接基类.   

2. 只能通过构造函数初始化. 不能直接访问基类成员初始化.

 

复制和赋值不虚构

没有意义.

 

派生类析构

1. 必须显示调用

2. 先析构派生类, 再析构基类, 与构造函数相反.

虚析构

1. 基类是虚析构, 派生类自动都声明为虚析构

2. 即使不释放, 基类也应该有个空虚析构.

 

派生类构造

1. 派生, 基类都有合成默认构造

2. 制定构造函数, 先构造基类, 再构造子类.

 

合成操作符

即: 系统提供的操作符

合成默认构造函数

合成复制构造函数

合成赋值操作符

 

类组成


#TODAY QUESTION

1. 析构函数何时用, 怎么用?

2. 虚析构函数怎么用? 

3. 赋值函数, 赋值构造函数, 析构函数虽然, 类自动合成, 但是何时需要自己手动写? 是不是每个类都要写?

4. 构造函数, 只初始化部分变量的情况, 其他变量是否会默认初始化为0?

5. 类的设计. 设计成什么样子, 哪些成员必须有, 哪些程序不必须有.


#Record

vector<int>::const_reverse_iterator rit = vec1.rbegin();

list<string>::iterator iter = find(slist.begin(), slist.end(), searchValue);

posted on 2010-12-21 19:59  oleeceo  阅读(376)  评论(0)    收藏  举报

导航