using namespace std;
int main()
{
map<char,int,less > map1;
map<char,int,less >::iterator mapIter;
//char 是键的类型,int是值的类型
//下面是初始化,与数组类似
//也可以用map1.insert(map<char,int,less >::value_type(''c'',3));
map1['c']=3;
map1['d']=4;
map1['a']=1;
map1['b']=2;
for(mapIter=map1.begin();mapIter!=map1.end();++mapIter)
cout<<" "<<(mapIter).first<<": "<<(mapIter).second;
//first对应定义中的char键,second对应定义中的int值
//检索对应于d键的值是这样做的:
map<char,int,less >::const_iterator ptr;
ptr=map1.find('d');
cout<<'/n'<<" "<<(ptr).first<<" 键对应于值:"<<(ptr).second;
return 0;
}
从以上例程中,我们可以看到map对象的行为和一般数组的行为类似。Map允许两个或多个值使用比较操作符。下面我们再看看multimap:
在map中是不允许一个键对应多个值的,在multimap中,不支持operator[],也就是说不支持map中允许的下标操作。
2. 算法(algorithm): inlcude
STL中算法的大部分都不作为某些特定容器类的成员函数,他们是泛型的,每个算法都有处理大量不同容器类中数据的使用。值得注意的是,STL中的算法大多有多种版本,用户可以依照具体的情况选择合适版本。中在STL的泛型算法中有4类基本的算法:
变序型队列算法:可以改变容器内的数据;
非变序型队列算法:处理容器内的数据而不改变他们;
排序值算法:包涵对容器中的值进行排序和合并的算法,还有二叉搜索算法、通用数值算法。(注:STL的算法并不只是针对STL容器,对一般容器也是适用的。)
变序型队列算法:又叫可修改的序列算法。这类算法有复制(copy)算法、交换(swap)算法、替代(replace)算法、删除(clear)算法,移动(remove)算法、翻转(reverse)算法等等。这些算法可以改变容器中的数据(数据值和值在容器中的位置)。
下面介绍2个比较常用的算法reverse()和copy()。
revese()的功能是将一个容器内的数据顺序翻转过来,它的原型是:
template
void reverse(Bidirectional first, Bidirectional last);
将first和last之间的元素翻转过来,上例中你也可以只将arr中的一部分进行翻转:
reverse(arr+3,arr+6); 这也是有效的。First和last需要指定一个操作区间。
Copy()是要将一个容器内的数据复制到另一个容器内,它的原型是:
Template<class InputIterator ,class OutputIterator>
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result);
它把[first,last-1]内的队列成员复制到区间[result,result+(last-first)-1]中。泛型交换算法:
Swap()操作的是单值交换,它的原型是:
template
void swap(T& a,T& b);
swap_ranges()操作的是两个相等大小区间中的值,它的原型是:
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator2swap_ranges(ForwardIterator1 first1,ForwardIterator1 last1, ForwardIterator1 first2);
交换区间[first1,last1-1]和[first2, first2+(last1-first1)-1]之间的值,并假设这两个区间是不重叠的。
非变序型队列算法,又叫不可修改的序列算法。这一类算法操作不影响其操作的容器的内容,包括搜索队列成员算法,等价性检查算法,计算队列成员个数的算法。我将用下面的例子介绍其中的find(),search(),count():
find()的原型是:
template<class InputIterator,class EqualityComparable>
InputIterator find(InputIterator first, InputIterator last, const EqualityComparable& value);
其功能是在序列[first,last-1]中查找value值,如果找到,就返回一个指向value在序列中第一次出现的迭代,如果没有找到,就返回一个指向last的迭代(last并不属于序列)。
search()的原型是:
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2);
其功能是在源序列[first1,last1-1]查找目标序列[first2,last2-1]如果查找成功,就返回一个指向源序列中目标序列出现的首位置的迭代。查找失败则返回一个指向last的迭代。
Count()的原型是:
template <class InputIterator, class EqualityComparable>
iterator_traits::difference_type count(InputIterator first,
InputIterator last, const EqualityComparable& value);
其功能是在序列[first,last-1]中查找出等于value的成员,返回等于value得成员的个数。
排序算法(sort algorithm):这一类算法很多,功能强大同时也相对复杂一些。这些算法依赖的是关系运算。在这里我只介绍其中比较简单的几种排序算法:sort(),merge(),includes()
sort()的原型是:
template
void sort(RandomAccessIterator first, RandomAccessIterator last);
功能是对[first,last-1]区间内的元素进行排序操作。与之类似的操作还有:partial_sort(), stable_sort(),partial_sort_copy()等等。
merge()的原型是:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge(InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, InputIterator2 st2,OutputIterator result);
将有序区间[first1,last1-1]和[first2,last2-1]合并到[result, result + (last1 - first1) + (last2 - first2)-1]区间内。
Includes()的原型是:
template <class InputIterator1, class InputIterator2>
bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
其功能是检查有序区间[first2,last2-1]内元素是否都在[first1,last1-1]区间内,返回一个bool值。
通用数值算法(generalized numeric algorithms):这一类算法还不多,涉及到专业领域中有用的算术操作,独立包涵于头文件中。
STL中的算法大都有多种版本,常见的版本有以下4中:
默认版本,假设给出了特定操作符;
一般版本,使用了成员提供的操作符;
复制版本,对原队列的副本进行操作,常带有 _copy 后缀;
谓词版本,只应用于满足给定谓词的队列成员,常带有 _if 后缀;
以上我们学习了STL容器和算法的概念,以及一些简单的STL容器和算法。在使用算法处理容器内的数据时,需要从一个数据成员移向另一个数据成员,迭代器恰好实现了这一功能。下面我们来学习STL迭代器 。
3. 迭代器(itertor): include