??xml version="1.0" encoding="utf-8" standalone="yes"?> # ?## 操作W是?a href="mk:@MSITStore:E:\doc\C++%20语言参?chm::/cppreference.com/preproc_details.html#define">#define宏用的. 使用# 使在#后的首个参数q回Z个带引号的字W串. 例如, 命o 会使编译器把以下命? 理解? 使用##q结##前后的内? 例如, 命o 会使编译器? 解释? 理所当然,会在标准输出处昄'10'. #line命o是用于更改__LINE__ ?__FILE__变量的? 文g名是可选的. __LINE__ ?__FILE__ 变量描述被读取的当前文g和行. 命o 更改行号?0,当前文g改ؓ"main.cpp". 语法:
预处理命?/h1>
#,##
#define to_string( s ) # s
cout << to_string( Hello World! ) << endl;
cout << "Hello World!" << endl;
#define concatenate( x, y ) x ## y
...
int xy = 10;
...
cout << concatenate( x, y ) << endl;
cout << xy << endl;
#line
语法:
#line line_number "filename"
#line 10 "main.cpp"
预定义变?/a>
__LINE__
__FILE__
__DATE__
__TIME__
_cplusplus
__STDC__
下列参数在不同的~译器可能会有所不同, 但是一般是可用?
In an unsigned type, all the bits represent the value. If a type is defined for a particular machine to use 8 bits, then the unsigned version of this type could hold the values 0 through 255.
无符号型中,所有的位都表示数倹{如果在某种机器中,定义一U类型?8 位表C,那么q种cd? unsigned 型可以取?0 ?255?/p>
The C++ standard does not define how signed types are represented at the bit level. Instead, each compiler is free to decide how it will represent signed types. These representations can affect the range of values that a signed type can hold. We are guaranteed that an 8-bit signed type will hold at least the values from 127 through 127; many implementations allow values from 128 through 127.
C++ 标准q未定义 signed cd如何用位来表C,而是由每个编译器自由军_如何表示 signed cd。这些表C方式会影响 signed cd的取D围? ?signed cd的取D定至是?-127 ?127Q但也有许多实现允许取g -128 ?127?/p>
Under the most common strategy for representing signed integral types, we can view one of the bits as a sign bit. Whenever the sign bit is 1, the value is negative; when it is 0, the value is either 0 or a positive number. An 8-bit integral signed type represented using a sign-bit can hold values from 128 through 127.
表示 signed 整型cd最常见的策略是用其中一个位作ؓW号位。符号位?1Q值就敎ͼW号位ؓ 0Q值就?0 或正数。一?signed 整型取值是?-128 ?127?/p>
The type of an object determines the values that the object can hold. This fact raises the question of what happens when one tries to assign a value outside the allowable range to an object of a given type. The answer depends on whether the type is signed or unsigned.
对象的类型决定对象的取倹{这会引起一个疑问:当我们试着把一个超出其取D围的Dl一个指定类型的对象Ӟl果会怎样呢?{案取决于这U类型是 signed q是 unsigned 的?/p>
For unsigned types, the compiler must adjust the out-of-range value so that it will fit. The compiler does so by taking the remainder of the value modulo the number of distinct values the unsigned target type can hold. An object that is an 8-bit unsigned char, for example, can hold values from 0 through 255 inclusive. If we assign a value outside this range, the compiler actually assigns the remainder of the value modulo 256. For example, we might attempt to assign the value 336 to an 8-bit signed char. If we try to store 336 in our 8-bit unsigned char, the actual value assigned will be 80, because 80 is equal to 336 modulo 256.
对于 unsigned cd来说Q编译器必须调整界g其满求。编译器会将该值对 unsigned cd的可能取值数目求模,然后取所得倹{比?8 位的 unsigned charQ其取D围从 0 ? 255Q包?255Q。如果赋l超个范围的|那么~译器将会取该值对 256 求模后的倹{例如,如果试图?336 存储?8 位的 unsigned char 中,则实际赋gؓ 80Q因?80 ?336 ?256 求模后的倹{?/p>
For the unsigned types, a negative value is always out of range. An object of unsigned type may never hold a negative value. Some languages make it illegal to assign a negative value to an unsigned type, but C++ does not.
对于 unsigned cd来说Q负数L出其取D围?tt>unsigned cd的对象可能永q不会保存负数。有些语a中将负数赋给 unsigned cd是非法的Q但?C++ 中这是合法的?/p>
In C++ it is perfectly legal to assign a negative number to an object with unsigned type. The result is the negative value modulo the size of the type. So, if we assign 1 to an 8-bit unsigned char, the resulting value will be 255, which is 1 modulo 256. C++ 中,把负Dl?unsigned 对象是完全合法的Q其l果是该负数对该cd的取g数求模后的倹{所以,如果?-1 赋给8位的 unsigned charQ那么结果是 255Q因?255 ?-1 ?256 求模后的倹{?/p> |
When assigning an out-of-range value to a signed type, it is up to the compiler to decide what value to assign. In practice, many compilers treat signed types similarly to how they are required to treat unsigned types. That is, they do the assignment as the remainder modulo the size of the type. However, we are not guaranteed that the compiler will do so for the signed types.
当将过取D围的Dl?signed cdӞq译器军_实际赋的倹{在实际操作中,很多的编译器处理 signed cd的方式和 unsigned cdcM。也是_赋值时是取该值对该类型取值数目求模后的倹{然而我们不能保证编译器都会q样处理 signed cd?/p>
以上摘自 c++ primer,惭愧Q还是再l细的从头品一ơ这书吧?br>
拯Q?br>
copyQ)
reverse_copy()
rotate_copy()
remove_copy() 拯不等于某值的元素到另一个序列?br>remove_copy_if() 拯W合条g的到另一个序列?/p>
填充和生成:
fill()
fill_n() 填充序列中的n个元素?br>generateQ)为序列中的每个元素调用genQ)函数?/p>
排列Q?br>next_permuttion() 后一个排列?br>prev_permutation()
partition() 划分Q将满条g的元素移动到序列的前面?br>stable_partition()
查找和替换:
findQ)
binary_search() 在一个已l有序的序列上查找?br>find_if()
search() 查第二个序列是否在第一个序列中出现Q且序相同?/p>
删除Q注意必调用eraseQ)来真正删?br>removeQ)
uniqueQ)删除盔R重复元素Q最好现排序?/p>
合ƈ序列Q?br>mergeQ)
数值算法:
accumulateQ) 对序列的每个元素q行q算后求和?br>transformQ) 也可以对每个元素q行q算?br>计数Q?br>sizeQ)M数?br>countQ){于某值的元素个数?/p>
adjacent_difference 序列中的后一个减前与他相ȝ前一个得到新的序列?/p>
adiacent_find
accumlate Q?/span> iterator Ҏ志的序列中的元素之和Q加C个由 init 指定的初始g。重载的版本不再做加法,而是传进来的二元操作W被应用到元素上?/span>
adjacent_different Q创Z个新序列Q该序列的每个新值都代表了当前元素与上一个元素的差。重载版本用指定的二元操作计相d素的差?/font>
adjacent_find Q在 iterator Ҏ志的元素范围内,查找一对相ȝ重复元素Q如果找到返回一?/span> ForwardIterator Q指向这对元素的W一个元素。否则返?/span> last 。重载版本用输入的二元操作W代替相{的判断?/span>
binary_search Q在有序序列中查?/span> value Q如果找到返?/span> true 。重载的版本使用指定的比较函数对象或者函数指针来判断相等?/span>
copy Q复制序列?/font>
copy_backward Q除了元素以相反的顺序被拯外,别的?/span> copy 相同?/span>
count Q利用等于操作符Q把标志范围cȝ元素与输入的D行比较,q返回相{元素的个数?/font>
count_if Q对于标志范围类的元素,应用输入的操作符Qƈq回l果?/span> true 的次数?/span>
equal Q如果两个序列在范围内的元素都相{,?/span> equal q回 true 。重载版本用输入的操作W代替了默认的等于操作符?/span>
equal_range Q返回一?/span> iterator Q第一?/span> iterator 表示?/span> lower_bound q回?/span> iterator Q第二个表示?/span> upper_bound q回?/span> iterator倹{?/span>
fill Q将输入的值的拯赋给范围内的每个元素?/font>
fill_n Q将输入的D值给 first ?/span> frist+n 范围内的元素?/span>
find Q利用底层元素的{于操作W,对范围内的元素与输入的D行比较。当匚wӞl束搜烦Q返回该元素的一?/span> InputIterator ?/span>
find_if Q用输入的函数替代了等于操作符执行?/span> find ?/span>
find_end Q在范围内查?#8220;p入的另外一?/span> iterator Ҏ志的W二个序?#8221;的最后一ơ出现。重载版本中使用了用戯入的操作W替代等于操作?/span>
find_first_of Q在范围内查?#8220;p入的另外一?/span> iterator Ҏ志的W二个序?#8221;中的L一个元素的W一ơ出现。重载版本中使用了用戯定义的操作符?/span>
for_each Q依ơ对范围内的所有元素执行输入的函数?/font>
generate Q通过对输入的函数 gen 的连l调用来填充指定的范围?/span>
generate_n Q填?/span> n 个元素?/span>
includes Q判?/span> [first1, last1) 的一个元素是否被包含在另外一个序列中。用底层元素的 <= 操作W,重蝲版本使用用户输入的函数?/span>
inner_product Q对两个序列做内U?/span> ( 对应的元素相乘,再求?/span> ) Qƈ内U加C个输入的的初始g。重载版本用了用户定义的操作?/span>
inner_merge Q合q两个排q序的连l序列,l果序列覆盖了两端范_重蝲版本使用输入的操作进行排序?/font>
iter_swap Q交换两?/span> ForwardIterator 的倹{?/span>
lexicographical_compare Q比较两个序列。重载版本用了用户自定义的比较操作?/font>
lower_bound Q返回一?/span> iterator Q它指向在范围内的有序序列中可以插入指定D不破坏容器序的第一个位|。重载函C用了自定义的比较操作?/span>
max Q返回两个元素中的较大的一个,重蝲版本使用了自定义的比较操作?/font>
max_element Q返回一?/span> iterator Q指出序列中最大的元素。重载版本用自定义的比较操作?/span>
min Q两个元素中的较者。重载版本用自定义的比较操作?/font>
min_element Q类g max_element Q不q返回最的元素?/span>
merge Q合q两个有序序列,q存攑ֈ另外一个序列中。重载版本用自定义的比较?/font>
mismatch Qƈ行的比较两个序列Q指出第一个不匚w的位|,它返回一?/span> iterator Q标志第一个不匚w的元素位|。如果都匚wQ返回每个容器的 last 。重载版本用自定义的比较操作?/span>
next_permutation Q取出当前范围内的排列,q将光新排序ؓ下一个排列。重载版本用自定义的比较操作?/font>
nth_element Q将范围内的序列重新排序Q所有小于第 n 个元素的元素都出现在它前面,而大于它的都出现在后面,重蝲版本使用了自定义的比较操作?/span>
partial_sort Q对整个序列做部分排序,被排序元素的个数正好可以被放到范围内。重载版本用自定义的比较操作?/font>
partial_sort_copy Q与 partial_sort 相同Q除了将l过排序的序列复制到另外一个容器?/span>
partial_sum Q创Z个新的元素序列,其中每个元素的g表了范围内该位置之前所有元素之和。重载版本用了自定义操作替代加法?/font>
partition Q对范围内元素重新排序,使用输入的函敎ͼ把计结果ؓ true 的元素都攑֜l果?/span> false 的元素之前?/span>
prev_permutation Q取围内的序列ƈ它重新排序Z一个序列。如果不存在上一个序列则q回 false 。重载版本用自定义的比较操作?/span>
random_shuffle Q对范围内的元素随机调整ơ序。重载版本输入一个随机数产生操作?/font>
remove Q删除在范围内的所有等于指定的元素Q注意,该函数ƈ不真正删除元素。内|数l不适合使用 remove ?/span> remove_if 函数?/span>
remove_copy Q将所有不匚w的元素都复制C个指定容器,q回?/span> OutputIterator 指向被拷贝的末元素的下一个位|?/span>
remove_if Q删除所有范围内输入操作l果?/span> true 的元素?/span>
remove_copy_if Q将所有不匚w的元素拷贝到一个指定容器?/font>
replace Q将范围内的所有等?/span> old_value 的元素都?/span> new_value 替代?/span>
replace_copy Q与 replace cMQ不q将l果写入另外一个容器?/span>
replace_if Q将范围内的所有操作结果ؓ true 的元素用新值替代?/span>
replace_copy_if Q类g replace_if Q不q将l果写入另外一个容器?/span>
reverse Q将范围内元素重新按反序排列?/font>
reverse_copy Q类g reverse Q不q将l果写入另外一个容器?/span>
rotate Q将范围内的元素Ud容器末尾Q由 middle 指向的元素成为容器第一个元素?/span>
rotate_copy Q类g rotate Q不q将l果写入另外一个容器?/span>
search Q给Z两个范围Q返回一?/span> iterator Q指向在范围内第一ơ出现子序列的位|。重载版本用自定义的比较操作?/span>
search_n Q在范围内查?/span> value 出现 n ơ的子序列。重载版本用自定义的比较操作?/span>
set_difference Q构造一个排q序的序列,其中的元素出现在W一个序列中Q但是不包含在第二个序列中。重载版本用自定义的比较操作?/font>
set_intersection Q构造一个排q序的序列,其中的元素在两个序列中都存在。重载版本用自定义的比较操作?/font>
set_symmetric_difference Q构造一个排q序的序列,其中的元素在W一个序列中出现Q但是不出现在第二个序列中。重载版本用自定义的比较操作?/font>
set_union Q构造一个排q序的序列,它包含两个序列中的所有的不重复元素。重载版本用自定义的比较操作?/font>
sort Q以升序重新排列范围内的元素Q重载版本用了自定义的比较操作?/font>
stable_partition Q与 partition cMQ不q它不保证保留容器中的相寚w序?/span>
stable_sort Q类g sort Q不q保留相{元素之间的序关系?/span>
swap Q交换存储在两个对象中的倹{?/font>
swap_range Q将在范围内的元素与另外一个序列的元素D行交换?/font>
transform Q将输入的操作作用在范围内的每个元素上,q生一个新的序列。重载版本将操作作用在一对元素上Q另外一个元素来自输入的另外一个序列。结果输出到指定的容器?/font>
unique Q清除序列中重复的元素,?/span> remove cMQ它也不能真正的删除元素。重载版本用了自定义的操作?/span>
unique_copy Q类g unique Q不q它把结果输出到另外一个容器?/span>
upper_bound Q返回一?/span> iterator Q它指向在范围内的有序序列中插入 value 而不破坏容器序的最后一个位|,该位|标志了一个大?/span> value 的倹{重载版本用了输入的比较操作?/span>
堆算法: C++ 标准库提供的?/span> max-heap 。一q以下 4 个泛型堆法?/span>
make_heap Q把范围内的元素生成一个堆。重载版本用自定义的比较操作?/font>
pop_heap Qƈ不是真正的把最大元素从堆中弹出Q而是重新排序堆。它?/span> first ?/span> last-1 交换Q然后重新做成一个堆。可以用容器的 back 来访问被“弹出“的元素或者?/span> pop_back 来真正的删除。重载版本用自定义的比较操作?/span>
push_heap Q假?/span> first ?/span> last-1 是一个有效的堆,要被加入堆的元素在位|?/span> last-1 Q重新生成堆。在指向该函数前Q必d把元素插入容器后。重载版本用指定的比较?/span>
sort_heap Q对范围内的序列重新排序Q它假设该序列是个有序的堆。重载版本用自定义的比较操作?/font>