赞
踩
本文将简介c++stl中一些常用算法copy、for_each、remove、remove_if、sort、partial_sort、stable_sort、find、find_if_not。当然还有很多,后续博客会继续总结!
#include <algorithm>
template <class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);
template<class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
while (first!=last) {
*result = *first;
++result; ++first;
}
return result;
}
void test() { vector<int> vec = {1, 9, 9, 5, 8, 1}; // 使用copy将vec从头到尾通过输出流输出 copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " ")); cout << endl; // 使用copy将vec的元素拷贝到vec1中 vector<int> vec1(vec.size()); auto it = copy(vec.begin(), vec.end(), vec1.begin()); // copy返回值是已经复制了元素的末尾指针 //(不含最后一个元素,想要获取最后一个元素,所以需要往前偏移一个指针) cout << "it = " << *(it - 1) << endl; cout << "vec1的元素:"; for (auto elem : vec1) { cout << elem << " "; } cout << endl; }
#include <algorithm>
template <class InputIterator, class Function>
Function for_each (InputIterator first, InputIterator last, Function fn);
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function fn)
{
while (first!=last) {
fn (*first);
++first;
}
return fn; // or, since C++11: return move(fn);
}
void print(int &value) { value *= 9; cout << value << " "; } void test() { vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9}; copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " ")); cout << endl; // 按照print函数的方式操作vec for_each(vec.begin(), vec.end(), print); cout << endl; cout << "lambda" << endl; // 采用匿名函数(lambda表达式) for_each(vec.begin(), vec.end(), [](int &value) { value += 1; cout << value << " "; }); cout << endl; }
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)
{
ForwardIterator result = first;
while (first!=last) {
if (!(*first == val)) {
if (result!=first)
*result = move(*first);
++result;
}
++first;
}
return result;
}
void test()
{
vector<int> vec = {1, 7, 9, 5, 1, 6, 2, 1};
// 删除vec中元素为1的元素,返回没有被删除的元素的末尾
auto it = remove(vec.begin(), vec.end(), 1);
for (auto p = vec.begin(); p != it; ++p)
{
cout << *p << " ";
}
cout << endl;
}
template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
UnaryPredicate pred);
template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
UnaryPredicate pred)
{
ForwardIterator result = first;
while (first!=last) {
if (!pred(*first)) {
if (result!=first)
*result = std::move(*first);
++result;
}
++first;
}
return result;
}
int func(int val) { return val > 5; } void test() { vector<int> vec = {1, 7, 9, 5, 1, 6, 2, 1}; // 返回值指向未删除的最后一个元素之后的元素的迭代器 auto it = remove_if(vec.begin(), vec.end(), func); // 删除所有需要删除元素(val > 5) vec.erase(it, vec.end()); for (auto elem : vec) { cout << elem << " "; } cout << endl; }
default (1) // 默认行为
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);
custom (2) // 自定义行为
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
bool myComp(int x, int y) { // 按照由大到小的方式排序 return x > y; } void test() { vector<int> vec = {1, 7, 9, 5, 1, 6, 2, 9}; // 使用默认行为的sort cout << "使用默认行为排序的sort!" << endl; sort(vec.begin(), vec.end()); for (auto elem : vec) { cout << elem << " "; } cout << endl; // 使用自定义行为排序的sort cout << "使用自定义行为排序的sort!" << endl; sort(vec.begin(), vec.end(), myComp); for (auto elem : vec) { cout << elem << " "; } cout << endl; }
default (1)
template <class RandomAccessIterator>
void partial_sort (RandomAccessIterator first, RandomAccessIterator middle,
RandomAccessIterator last);
custom (2)
template <class RandomAccessIterator, class Compare>
void partial_sort (RandomAccessIterator first, RandomAccessIterator middle,
RandomAccessIterator last, Compare comp);
bool myComp(int x, int y) { // 按照由大到小的方式排序 return x > y; } void test2() { vector<int> vec = {1, 7, 9, 5, 1, 6, 2, 9}; // 将vec中的元素进行排序,使前五个元素是整个vec范围内最小的5个元素, // 并且按照升序的方式排序剩余元素不排序 partial_sort(vec.begin(), vec.begin() + 5, vec.end()); for (auto elem : vec) { cout << elem << " "; } cout << endl; partial_sort(vec.begin(), vec.begin() + 5, vec.end(), myComp); for (auto elem : vec) { cout << elem << " "; } cout << endl; }
template <class RandomAccessIterator>
void stable_sort ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void stable_sort ( RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);
template<class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val)
{
while (first!=last) {
if (*first==val) return first;
++first;
}
return last;
}
void test()
{
vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
vector<int>::iterator it = find(vec.begin(), vec.end(), 5);
if (it != vec.end())
{
cout << "element " << *it << " found in vec" << endl;
}
else
{
cout << "not found!" << endl;
}
}
template <class InputIterator, class UnaryPredicate>
InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred);
template<class InputIterator, class UnaryPredicate>
InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred)
{
while (first!=last) {
if (!pred(*first)) return first;
++first;
}
return last;
}
bool func(int val)
{
// 返回第一个偶数,当val为偶数时,返回false,停止查找
return val % 2;
}
void test5()
{
vector<int> vec = {7, 1, 9, 7, 5, 8, 1, 2, 6};
// 当func函数返回false时,find_if_not查找完成,并且返回第一个查找的元素
auto it = find_if_not(vec.begin(), vec.end(), func);
cout << "第一个偶数是: " << *it << endl;
}
如果本文对你有帮助,记得一键三连哦,一键三连笑哈哈,代码能力顶呱呱!
本人能力有限,如有错误,望不吝指正;原创不易,欢迎转载,转载请注明出处!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。