Chapter 7
<map>头
按照键自动排序,所以键的类型要求是可以比较的。
map的每个元素实际上是一个pair对,设it是map的迭代器,则通过it->first, it->second访问键和值。
二者为左值,不过it->first 是const类型的。
统计单词出现的次数:
1
2
3
|
map<string,
int
> counters;
while
(cin >> s )
++counters[ s ];
|
如果用一个未曾出现过的键来作为map的索引,将自动创建一个新pair,同时值将被默认初始化(int 类型将初始化为0 )。
这样一来,想要定位map中的某个键值对就不能用类似words [ word ]了,而是使用map的find成员,然后检查其返回值是否是words.end()以确定该word存在words中:
1
2
3
|
map<string,
int
>::const_iterator it = words.find( word );
if
( it== words.end() )
cout <<
" 单词不存在! "
;
|
Chapter 8
typename
1.在模板头中等价于class,即:
template<typename T>
等价于
template<class T>
2.
告诉编译器把一个特殊的名字解释成一个类型。
typenameT::Y m_y; // treat Y as a type
T的类型尚未知,编译器不能确定T::Y是一个类型的名字(typename)还是一个变量的名字。
五种迭代器
输入迭代器: 按照一个方向顺序地访问,只能输入。
如用于istream的输入流迭代器istream_iterator。
1
2
3
|
//从标准输入中读整数并把它们添加到v中
vector<
int
> v;
std::copy(istream_iterator<
int
>(cin), istream_iterator<
int
>(),back_inserter(v) );
|
输出迭代器:按照一个方向顺序访问,只能输出。
如ostream_iterator:
1
2
|
//输出v的元素,元素之间用一个空格隔开
copy(v.begin(), v.end(), ostream_iterator<
int
>(cout,
" "
) );
|
另一个输出迭代器的例子是back_inserter;
正向迭代器:按照一个方向顺序访问,能输入和输出。
双向迭代器:按两个方向顺序访问,能输入和输出。
所有标准库容器类都支持双向迭代器。
即支持的操作有:
*it
++
--
it1 == it2 it1 != it2
it->member;
随机访问迭代器:能随机访问元素,能输入和输出。
与双向迭代器相比,还支持的操作有:
it + n it - n n + it
it1 - it2
it[n]
it1 < it2 it1 > it2 it1 >= it2
(// intn)
vector和string迭代器是随机访问迭代器。