Sun Studio 12 Update 1:C++ 用户指南

第 13 章 使用 C++ 标准库

当在缺省(标准)模式下编译时,编译器可以访问 C++ 标准指定的整个库。库组件包括一般称为标准模板库 (Standard Template Library, STL) 的库和下列组件。

术语 STL 没有正式的定义,但是通常理解为包括容器、迭代器以及算法。以下标准库头的子集可以认为包含了 STL。

C++ 标准库 (libCstd) 基于 RogueWaveTM Standard C++ Library, Version 2。该库仅在编译器的缺省模式 (-compat=5) 下可用,并且在使用 -compat[=4] 选项时不支持该库。

C++ 编译器还支持 STLport 的标准库实现版本 4.5.3。libCstd 仍是缺省库,STLport 的产品只是备选的。有关更多信息,请参见13.3 STLport

如果需要使用自己的 C++ 标准库版本而非编译器附带的某一版本,可以通过指定 -library=no%Cstd 选项来实现。替换与编译器一起发布的标准库是有风险的,不能保证产生预期的结果。有关更多信息,请参见12.7 替换 C++ 标准库

有关标准库的详细信息,请参见《标准 C++ 库用户指南和《Standard C++ Class Library Reference》。

13.1 C++ 标准库头文件

表 13–1 列出了完整标准库的头文件以及每个头文件的简要介绍。

表 13–1 C++ 标准库头文件

头文件 

说明 

<algorithm>

操作容器的标准算法 

<bitset>

位的固定大小序列 

<complex>

数字类型表示复数 

<deque>

支持在端点增加和删除的序列 

<exception>

预定义异常类 

<fstream>

文件的流 I/O 

<functional>

函数对象 

<iomanip>

iostream 操纵符

<ios>

iostream 基类

<iosfwd>

iostream 类的前向声明

<iostream>

基本流 I/O 功能 

<istream>

输入 I/O 流 

<iterator>

遍历序列的类 

<limits>

数字类型的属性 

<list>

排序的序列 

<locale>

国际化支持 

<map>

带有键/值对的关联容器 

<memory>

专用内存分配器 

<new>

基本内存分配和释放 

<numeric>

通用的数字操作 

<ostream>

输出 I/O 流 

<queue>

支持在头部增加和在尾部删除的序列 

<set>

有唯一键值的关联容器 

<sstream>

将内存中的字符串用为源或接收器的流 I/O 

<stack>

支持在头部增加和删除的序列 

<stdexcept>

附加的标准异常类 

<streambuf>

iostream 的缓冲区类 

<string>

字符序列 

<typeinfo>

运行时类型标识 

<utility>

比较运算符 

<valarray>

用于数字编程的值数组 

<vector>

支持随机访问的序列 

13.2 C++ 标准库手册页

表 13–2 列出了标准库中每个组件的可用文档。

表 13–2 C++ 标准库手册页

手册页 

概述 

Algorithms

在容器和序列上执行各种操作的通用算法 

Associative_Containers

排序的容器 

Bidirectional_Iterators

可以读取和写入,并且可以双向遍历容器的迭代器 

Containers

标准模板库 (standard template library, STL) 集合 

Forward_Iterators

可以读取和写入的前移式迭代器 

Function_Objects

定义了 operator() 的对象

Heap_Operations

请参见与 make_heappop_heappush_heapsort_heap 对应的条目

Input_Iterators

只读的前移式迭代器 

Insert_Iterators

允许迭代器向容器插入元素而非覆盖容器内元素的迭代器适配器 

Iterators

集合遍历和修改的指针泛化 

Negators

用于遍历谓词函数对象检测的函数适配器和函数对象 

Operators

C++ 标准模板库输出的运算符 

Output_Iterators

只写的前移式迭代器 

Predicates

返回布尔 (true/false) 值或整型值的函数或函数对象 

Random_Access_Iterators

可以读取、写入并随机访问容器的迭代器 

Sequences

组织序列集合的容器 

Stream_Iterators

包括允许直接在流上使用通用算法的 ostream 和 istream 的迭代器功能 

__distance_type

确定迭代程序所用距离的类型(已过时) 

__iterator_category

确定迭代程序所属的类别(已过时) 

__reverse_bi_iterator

向后遍历集合的迭代器 

accumulate

将一定范围内的所有元素聚集到单个值中 

adjacent_difference

输出在一定范围内每个相邻元素对之间的差别的序列 

adjacent_find

寻找在序列中相等的第一个相邻元素对 

advance

按特定的距离将迭代器向前或者向后移动(如可能) 

allocator

在标准库容器中用于存储管理的缺省分配器对象 

auto_ptr

一个简单、智能的指针类 

back_insert_iterator

用于在集合末端插入项目的插入迭代器 

back_inserter

用于在集合末端插入项目的插入迭代器 

basic_filebuf

将输入序列或输出序列与文件关联的类 

basic_fstream

支持对命名文件的读取和写入,或者与文件描述符关联的设备的读取和写入 

basic_ifstream

支持从命名文件读取或者从其他与文件描述符关联的设备读取 

basic_ios

一个包含所有流都需要的通用函数的基类 

basic_iostream

帮助格式化或者翻译由流缓冲区控制的字符序列 

basic_istream

帮助读取或者翻译由流缓冲区控制的序列输入 

basic_istringstream

支持从内存中的数组读取 basic_string<charT,traits,Allocator> 类的对象

basic_ofstream

支持写入命名文件或者其他与文件描述符关联的设备 

basic_ostream

帮助格式化或者写入由流缓冲区控制的序列输出 

basic_ostringstream

支持写入 basic_string<charT,traits,Allocator> 类的对象

basic_streambuf

用于派生便于字符序列控制的各种流缓冲区的抽象基类 

basic_string

处理类似字符实体的模板化类 

basic_stringbuf

将输入或者输出序列与任意字符序列关联 

basic_stringstream

支持在内存中的数组中写入和读取 basic_string<charT,traits,Allocator> 类的对象

binary_function

创建二元函数对象的基类 

binary_negate

返回二元谓词结果补码的函数对象 

binary_search

对容器中的值执行二元搜索 

bind1st

用于将值绑定到函数对象的模板化实用程序 

bind2nd

用于将值绑定到函数对象的模板化实用程序 

binder1st

用于将值绑定到函数对象的模板化实用程序 

binder2nd

用于将值绑定到函数对象的模板化实用程序 

bitset

用于存储和处理固定大小位序列的模板类和相关函数 

cerr

控制向与 <cstdio> 中声明的对象 stderr 关联的无缓冲流缓冲区的输出

char_traits

具有用于 basic_string 容器和 iostream 类的类型和运算的特性类

cin

控制从与 <cstdio> 中声明的对象 stdin 关联的流缓冲区的输入

clog

控制向与 <cstdio> 中声明的对象 stderr 关联的流缓冲区的输出

codecvt

代码转换侧面 

codecvt_byname

一个包含以命名语言环境为基础的代码集转换分类工具的侧面 

collate

一个字符串检验、比较和散列侧面 

collate_byname

一个字符串检验、比较和散列侧面 

compare

返回真或假的二元函数或函数对象 

complex

C++ 复数库 

copy

复制一定范围内的元素 

copy_backward

复制一定范围内的元素 

count

计算容器中满足给定条件的元素的数量 

count_if

计算容器中满足给定条件的元素的数量 

cout

控制向与 <cstdio> 中声明的对象 stdout 关联的流缓冲区的输出

ctype

包括字符分类工具的侧面 

ctype_byname

一个包含以命名语言环境为基础的字符分类工具的侧面 

deque

一个支持随机访问迭代器并支持在开始和结束位置进行高效插入/删除的序列 

distance

计算两个迭代器之间的距离 

divides

返回用第一个参数除以第二个参数所得到的结果 

equal

比较等式的两个范围 

equal_range

在集合中找到最大的子范围,可在该范围中插入一个给定值而无需违反集合排序 

equal_to

如果第一个参数与第二个参数相等就返回真的二元函数对象 

exception

一个支持逻辑和运行时错误的类 

facets

用于封装语言环境功能分类的类系列 

filebuf

将输入序列或输出序列与文件关联的类 

fill

用给定值初始化一个范围 

fill_n

用给定值初始化一个范围 

find

在序列中寻找出现的值 

find_end

在序列中寻找上次出现的子序列 

find_first_of

在序列中寻找在另一个序列中第一次出现的值 

find_if

在满足特定谓词的序列中寻找第一次出现的值 

for_each

将函数应用于范围内的每个元素 

fpos

保持 iostream 类的位置信息 

front_insert_iterator

用于在集合起始端插入条目的插入迭代器 

front_inserter

用于在集合起始端插入条目的插入迭代器 

fstream

支持对命名文件的读取和写入,或者与文件描述符关联的设备的读取和写入 

generate

初始化一个具有由值产生器类产生的值的容器 

generate_n

初始化一个具有由值产生器类产生的值的容器 

get_temporary_buffer

基于指针的基元,用于处理内存 

greater

如果第一个参数比第二个参数大就返回真的二元函数对象 

greater_equal

如果第一个参数大于或等于第二个参数就返回真的二元函数对象 

gslice

用于表示数组的通用片的数字数组类 

gslice_array

用于表示 valarray 的类 BLAS 片的数字数组类

has_facet

用于确定语言环境是否具有给定侧面的函数模板 

ifstream

支持从命名文件读取或者从其他与文件描述符关联的设备读取 

includes

已排序序列的一系列基本操作 

indirect_array

用于表示从 valarray 中所选元素的数字数组类 

inner_product

计算两个范围 A 和 B 的内积 A X B 

inplace_merge

将两个已排序的序列合并成为一个 

insert_iterator

用于将项目插入集合而非覆盖集合的插入迭代器 

inserter

用于将项目插入集合而非覆盖集合的插入迭代器 

ios

一个包含所有流都需要的通用函数的基类 

ios_base

定义成员类型并维护从它继承的类的数据 

iosfwd

声明输入/输出库模板类并使之专用于宽字符和微型字符 

isalnum

确定字符是字母还是数字 

isalpha

确定字符是否为字母 

iscntrl

确定字符是否为控制字符 

isdigit

确定字符是否为十进制数字 

isgraph

确定字符是否为图形字符 

islower

确定字符是否为小写形式 

isprint

确定字符是否可打印 

ispunct

确定字符是否为标点符号 

isspace

确定字符是否为空格 

istream

帮助读取或者翻译由流缓冲区控制的序列输入 

istream_iterator

具有 istreams 迭代器功能的流迭代器 

istreambuf_iterator

从流缓冲区读取为其构造的连续字符 

istringstream

支持从内存中的数组读取 basic_string<charT,traits,Alocator> 类的对象

istrstream

从内存中的数组读取字符 

isupper

确定字符是否为大写形式 

isxdigit

确定字符是否为十六进制数字 

iter_swap

交换两个位置的值 

iterator

基本的迭代器类 

iterator_traits

返回有关迭代器的基本信息 

less

如果第一个参数比第二个参数小就返回真的二元函数对象 

less_equal

如果第一个参数小于或等于第二个参数就返回真的二元函数对象 

lexicographical_compare

按照字典编排顺序来比较两个范围 

limits

请参阅 numeric_limits

list

支持双向迭代器的序列 

locale

包含多态侧面集的本地化类 

logical_and

如果两个参数都为真就返回真的二元函数对象 

logical_not

如果参数是假就返回真的一元函数对象 

logical_or

如果两个参数有一个为真就返回真的二元函数 

lower_bound

确定在已排序容器中元素的第一个有效位置 

make_heap

创建堆 

map

用唯一关键字访问非关键字值的关联容器 

mask_array

给出了 valarray 的屏蔽视图的数字数组类 

max

查找并返回一对值中的最大值 

max_element

查找一个范围中的最大值 

mem_fun

与指向成员函数的指针相匹配的函数对象,替代全局函数 

mem_fun1

与指向成员函数的指针相匹配的函数对象,替代全局函数 

mem_fun_ref

与指向成员函数的指针相匹配的函数对象,替代全局函数 

mem_fun_ref1

与指向成员函数的指针相匹配的函数对象,替代全局函数 

merge

将两个已排序的序列合并为第三个序列 

messages

消息传送侧面 

messages_byname

消息传送侧面 

min

查找并返回一对值中的最小值 

min_element

查找一个范围中的最小值 

minus

返回用第一个参数减去第二个参数所得到的结果 

mismatch

比较来自两个序列的元素并返回前两个不匹配的元素 

modulus

返回第一个参数除以第二个参数所得到的余数 

money_get

输入的货币格式 

money_put

输出的货币格式 

moneypunct

货币标点格式 

moneypunct_byname

货币标点格式 

multimap

用关键字访问非关键字值的关联容器 

multiplies

用于返回第一个参数与第二个参数相乘结果的二元函数对象。 

multiset

允许快速访问已保存关键字值的关联容器 

negate

返回其参数负值的一元函数对象 

next_permutation

生成以排序函数为基础的序列的连续置换 

not1

对一元谓词函数对象进行求反操作的函数适配器 

not2

对一元谓词函数对象进行求反操作的函数适配器 

not_equal_to

如果第一个参数与第二个参数不相等就返回 true 的二元函数对象 

nth_element

重新排列集合,以使按照排序顺序,低于第 n 个元素的所有元素位于该元素之前,高于第 n 个元素的所有元素位于该元素之后

num_get

输入的数字格式 

num_put

输出的数字格式 

numeric_limits

表示标量类型信息的类 

numpunct

数字标点格式 

numpunct_byname

数字标点格式 

ofstream

支持写入命名文件或者其他与文件描述符关联的设备 

ostream

帮助格式化或者写入由流缓冲区控制的序列输出 

ostream_iterator

流迭代器允许使用具有 ostream 和 istream 的迭代器 

ostreambuf_iterator

向从其构造的流缓冲区对象写入连续的字符 

ostringstream

支持写入 basic_string<charT,traits,Allocator> 类的对象

ostrstream

写入一个在内存中的数组 

pair

异类值对的模板 

partial_sort

对实体集合排序的模板化算法 

partial_sort_copy

对实体集合排序的模板化算法 

partial_sum

计算一组值的连续部分的和 

partition

将所有满足给定谓词的实体放置在不满足给定谓词的实体后面 

permutation

生成以排序函数为基础的序列的连续置换 

plus

用于返回第一个参数与第二个参数相加结果的二元函数对象 

pointer_to_binary_function

采用指向二元函数的指针的函数对象,替代 binary_function

pointer_to_unary_function

采用指向函数的指针的函数对象类,替代 unary_function

pop_heap

从堆中移出最大的元素 

prev_permutation

生成以排序函数为基础的序列的连续置换 

priority_queue

像优先队列一样运行的容器适配器 

ptr_fun

一个与指向某函数的指针对应的过载函数,替换一个函数 

push_heap

将一个新元素放入堆 

queue

像队列一样运行的容器适配器(先入先出) 

random_shuffle

集合的随机混洗元素 

raw_storage_iterator

使基于迭代器的算法能够将结果存入尚未初始化的内存中 

remove

将所需元素移动到容器的前端,并返回一个说明所需元素序列的结束位置的迭代器 

remove_copy

将所需元素移动到容器的前端,并返回一个说明所需元素序列的结束位置的迭代器 

remove_copy_if

将所需元素移动到容器的前端,并返回一个说明所需元素序列的结束位置的迭代器 

remove_if

将所需元素移动到容器的前端,并返回一个说明所需元素序列的结束位置的迭代器 

replace

用新值替换集合中的元素 

replace_copy

用新值替换集合中的元素,并将修改过的序列移入结果 

replace_copy_if

用新值替换集合中的元素,并将修改过的序列移入结果 

replace_if

用新值替换集合中的元素 

return_temporary_buffer

基于指针的基元,用于处理内存 

reverse

反转集合中元素的顺序 

reverse_copy

将集合中元素复制到新集合时反转它们的顺序 

reverse_iterator

向后遍历集合的迭代器 

rotate

将包含第一个元素到第中间减 1 个元素的部分与包含从中间到最后元素的部分交换 

rotate_copy

将包含第一个元素到第中间减 1 个元素的部分与包含从中间到最后元素的部分交换 

search

在值(这些值在元素状态时与标明范围内的值相等)的序列中查找子序列 

search_n

在值(这些值在元素状态时与标明范围内的值相等)的序列中查找子序列 

set

支持唯一关键字的关联容器 

set_difference

构建已排序差集的基本设置操作 

set_intersection

构建已排序交集的基本设置操作 

set_symmetric_difference

构建已排序对称差集的基本设置操作 

set_union

构建已排序并集的基本设置操作 

slice

表示数组的类 BLAS 片的数字数组类 

slice_array

用于表示 valarray 的类 BLAS 片的数字数组类

smanip

用于实现参数化操纵符的帮助程序类 

smanip_fill

用于实现参数化操纵符的帮助程序类 

sort

对实体集合排序的模板化算法 

sort_heap

将堆转换为已排序的集合 

stable_partition

在保持每组中元素的相对顺序的同时,将所有满足给定谓词的实体放在所有不满足给定谓词的实体之前 

stable_sort

对实体集合排序的模板化算法 

stack

像堆栈一样运行的容器适配器(后入先出) 

streambuf

用于派生便于字符序列控制的各种流缓冲区的抽象基类 

string

basic_string<char, char_traits<char>, allocator<char>> 的 typedef

stringbuf

将输入或者输出序列与任意字符序列关联 

stringstream

支持在内存中的数组中写入和读取 basic_string<charT,traits,Alocator> 类的对象

strstream

在内存中读取或者写入一个数组 

strstreambuf

将输入序列或者输出序列与微型字符数组(其元素存储任意值)关联 

swap

交换值 

swap_ranges

将一个位置的值与在其他位置的值交换 

time_get

输入的时间格式 

time_get_byname

输入的时间格式,以命名语言环境为基础 

time_put

输出的时间格式 

time_put_byname

输出的时间格式,以命名语言环境为基础 

tolower

将字符转换为小写形式 

toupper

将字符转换为大写形式 

transform

将操作应用到集合中的一系列值并且存储结果 

unary_function

创建一元函数对象的基类 

unary_negate

返回一元谓词结果补码的函数对象 

uninitialized_copy

使用构造从一个范围向另一个位置复制值的算法 

uninitialized_fill

使用了在集合中设置值的构造算法的算法 

uninitialized_fill_n

使用了在集合中设置值的构造算法的算法 

unique

从一个值范围移除连续的重复值并将得到的唯一值放入结果 

unique_copy

从一个值范围移除连续的重复值并将得到的唯一值放入结果 

upper_bound

确定已排序容器中值的最后一个有效位置 

use_facet

用于获取侧面的模板函数 

valarray

用于数字操作的优化数组类 

vector

支持随机访问迭代器的序列 

wcerr

控制向与 <cstdio> 中声明的对象 stderr 关联的无缓冲流缓冲区的输出

wcin

控制从与 <cstdio> 中声明的对象 stdin 关联的流缓冲区的输入

wclog

控制向与 <cstdio> 中声明的对象 stderr 关联的流缓冲区的输出

wcout

控制向与 <cstdio> 中声明的对象 stdout 关联的流缓冲区的输出

wfilebuf

将输入序列或输出序列与文件关联的类 

wfstream

支持对命名文件的读取和写入,或者与文件描述符关联的设备的读取和写入 

wifstream

支持从命名文件读取或者从其他与文件描述符关联的设备读取 

wios

一个包含所有流都需要的通用函数的基类 

wistream

帮助读取或者翻译由流缓冲区控制的序列输入 

wistringstream

支持从内存中的数组读取 basic_string<charT,traits,Allocator> 类的对象

wofstream

支持写入命名文件或者其他与文件描述符关联的设备 

wostream

帮助格式化或者写入由流缓冲区控制的序列输出 

wostringstream

支持写入 basic_string<charT,traits,Allocator> 类的对象

wstreambuf

用于派生便于字符序列控制的各种流缓冲区的抽象基类 

wstring

basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t>> 的 typedef

wstringbuf

将输入或者输出序列与任意字符序列关联 

13.3 STLport

如果要使用替换 libCstd 的标准库,请使用标准库的 STLport 实现。可以使用以下编译器选项关闭 libCstd 并改用 STLport 库:

有关更多信息,请参见A.2.50 -library=l[ ,l...]

本发行版包括称为 libstlport.a 的静态归档文件和称为 libstlport.so 的动态库。

决定是否使用 STLport 实现之前,请先考虑以下信息:

13.3.1 重新分发和支持的 STLport 库

请参见运行时库自述文件,了解可依照“最终用户目标代码许可协议”的条款随您的可执行文件或库重新分发的库和目标文件列表。此自述文件的 C++ 部分列出该编译器发行版支持的 STLport .so 版本。此自述文件作为产品文档的一部分可以从 Sun Studio SDN 门户网站 (http://developers.sun.com/sunstudio/documentation/) 上获取。

因为以下测试示例中的代码将库实现假定为不可移植,所以在该测试示例中不能使用 STLport 编译。具体来说,它假定 <vector><iostream> 自动包含 <iterator>,这是无效假定。


#include <vector>
#include <iostream>

using namespace std;

int main ()
{
    vector <int> v1 (10);
    vector <int> v3 (v1.size());
    for (int i = 0; i < v1.size (); i++)
      {v1[i] = i; v3[i] = i;}
    vector <int> v2(v1.size ());
    copy_backward (v1.begin (), v1.end (), v2.end ());
    ostream_iterator<int> iter (cout, " ");
    copy (v2.begin (), v2.end (), iter);
    cout << endl;
    return 0;
}

要解决该问题,请将 <iterator> 包含在源代码中。