std::sort
-
将容器元素进行排序, 会改变容器顺序, 默认从小到大排序
void sort( RandomIt first, RandomIt last );
-
comp: returns true if the first argument is less than the second.
struct { bool operator()(int a, int b) const { return a < b; } } customLess;
-
算法复杂度: nlogn
std::partial_sort
-
将容器中的[first, middle)元素进行排序, 会改变容器顺序, 默认从小到大排序
void partial_sort( RandomIt first, RandomIt middle, RandomIt last );
-
comp: returns true if the first argument is less than the second.
-
算法复杂度: Approximately (last-first)log(middle-first) applications of cmp.
std::nth_element
-
找到容器中假设从小到大排序的第n个元素, 会改变容器顺序, 一般用于找中位数
void nth_element( RandomIt first, RandomIt nth, RandomIt last );
-
comp: returns true if the first argument is less than the second.
-
算法复杂度: Linear in std::distance(first, last) on average.
std::partition
-
将容器中满足条件的放在一边, 不满足条件的放在另一边, 返回两边中间另一边开始前的指针, 会改变容器顺序
-
UnaryPredicate: unary predicate which returns true if the element should be ordered before other elements.
auto it = std::partition(v.begin(), v.end(), [](int i){return i % 2 == 0;});
-
算法复杂度: n
std::lower_bound
-
找到容器中第一个大于等于一个值的元素, 不会改变容器顺序, 要求容器有序
Returns an iterator pointing to the first element in the range [first, last) that does not satisfyelement < value
(or comp(element, value)),
(i.e. greater or equal to), or last if no such element is found.ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value );
-
comp: binary predicate which returns true if the first argument is less than the second.
auto prc_info = std::lower_bound(prices.begin(), prices.end(), to_find, [](const PriceInfo& info, double value) { return info.price < value; });
-
算法复杂度: logn
std::upper_bound
-
找到容器中第一个大于一个值的元素, 不会改变容器顺序, 要求容器有序
Returns an iterator pointing to the first element in the range [first, last) such thatvalue < element
(or comp(value, element)) is true (i.e. strictly greater), or last if no such element is found.ForwardIt upper_bound( ForwardIt first, ForwardIt last, const T& value );
-
comp: binary predicate which returns true if the first argument is less than the second.
auto prc_info = std::upper_bound(prices.begin(), prices.end(), to_find, [](double value, const PriceInfo& info) { return value < info.price; });
-
算法复杂度: logn
std::equal_range
-
Returns a range containing all elements equivalent to value in the range [first, last). 要求容器有序
Possible implementation:
template<class ForwardIt, class T> std::pair<ForwardIt, ForwardIt> equal_range(ForwardIt first, ForwardIt last, const T& value) { return std::make_pair(std::lower_bound(first, last, value), std::upper_bound(first, last, value)); }
-
comp: binary predicate which returns true if the first argument is less than the second.
-
算法复杂度: 2 * logn
std::binary_search
-
二分法查找element equivalent to value, 要求容器有序, 不会改变容器顺序
Possible implementation:template<class ForwardIt, class T> bool binary_search(ForwardIt first, ForwardIt last, const T& value) { first = std::lower_bound(first, last, value); return (!(first == last) && !(value < *first)); }
-
comp: binary predicate which returns true if the first argument is less than the second.
-
算法复杂度: logn
std::transform
-
将一个容器中的元素施加某种算法后, 并作用于另一个容器上
-
unary_op/binary_op:
std::transform(s.cbegin(), s.cend(), s.begin(), // write to the same location [](unsigned char c) { return std::toupper(c); }); std::transform(s.cbegin(), s.cend(), std::back_inserter(ordinals), [](unsigned char c) { return c; }); std::transform(ordinals.cbegin(), ordinals.cend(), ordinals.cbegin(), ordinals.begin(), std::plus<>{});
-
算法复杂度: n
std::unique
-
去除器中相邻的两个equivalent elements中的一个, 通常与erase联合使用, 完成真正意义上的删除, 不要求容器有序
left_boundary.erase(std::unique(left_boundary.begin(), left_boundary.end()), left_boundary.end());
-
BinaryPredicate: binary predicate which returns true if the elements should be treated as equal.
-
算法复杂度: n
std::remove/std::remove_if
-
去除容器中满足特定条件的元素, 通常与erase联合使用, 完成真正意义上的删除, 不要求容器有序
auto noSpaceEnd = std::remove(str1.begin(), str1.end(), ' '); str1.erase(noSpaceEnd, str1.end());
-
UnaryPredicate: unary predicate which returns true if the element should be removed.
str2.erase(std::remove_if(str2.begin(), str2.end(), [](unsigned char x){return std::isspace(x);}), str2.end());
-
算法复杂度: n
std::for_each
-
对一个容器循环调用某个函数
std::for_each(nums.begin(), nums.end(), [](int &n){ n++; });
因为c++11引入了
for(auto var : vars)
基于范围的for循环语法, 使得for_each的语义表达相形见绌了许多, 大多数情况可以不用for_each -
算法复杂度: n
std::min_element/std::max_element
-
找到容器中最大/最小元素, 默认使用
<
比较 -
comp: comparison function object (i.e. an object that satisfies the requirements of Compare) which returns true if the first argument is less than the second.
result = std::max_element(v.begin(), v.end(), [](int a, int b) { return std::abs(a) < std::abs(b); });
-
算法复杂度: n