目录
查找算法
排序算法
删除算法
查找算法
基本查找
find:区间查找find_if:条件查找find_first_of:查找区间第一次出现的值adjacent_find:查找区间第一次重复的值search:子序列查找search_n:子序列查找出现次数
统计查找
count:区间统计count_if:条件统计个数equal:比较
有序查找
binary_search:二分查找upper_bound:查找最后一个大于查找的值lower_bound:查找大于等于查找的值equal_range:区间比较...有序序列
#include#include #include #include #include using namespace std; int main() { // find:区间查找 vector vec= { 1,2,3,4,5,6,7,8,9 }; auto F = find(vec.begin(), vec.end(), 9);//找自定义类型需要重载运算符 //没找到:结束位置 if (F != vec.end()) { cout << *F << endl; } //find_if:条件查找 auto pre = find_if(vec.begin(), vec.end(), [](int a) {return a > 3; }); cout << *pre << endl; //find_first_of:查找区间第一次出现的值 int array[] = { 44,1,2 }; //vec.begin() vec.end()拿出一个元素跟temp temp+2 比较,满足就返回 auto ffo = find_first_of(vec.begin(), vec.end(), array, array + 2); cout << *ffo << endl; //adjacent_find:查找区间第一次重复的值 int rever[]= { 1,1,2,2,3,4,5 }; auto af = adjacent_find(rever, rever+7); cout << *af << endl; //search:子序列查找 int fans[] = { 1,1,2 }; auto S = search(af, af + 7, fans, fans + 3); cout << *S << endl;//输出满足序列的第一个元素 //search_n:子序列查找出现次数 auto sn = search_n(fans, fans + 3, 2, 1); cout << *sn << endl; sn = search_n(rever, rever + 7, 3, 2, [](int a, int b) {return a > b; }); cout << *sn << endl; //count:区间统计 cout << count(rever, rever + 7, 1) << endl;; //count_if:条件统计个数 cout << count_if(rever, rever + 7, [](int x) {return x > 1; })<
排序算法
merge:归并排序,存于新容器inplace_merge:归并排序,覆盖原区间sort:排序,更改原容器排序stable_sort:排序,保存原容器顺序排序nth_element:关键字排序partition:范围排序partial_sort:范围排序partial_sort_copy:局部排序,结果另存stable_partition:范围排序,保存原容器排序random_shuffle:随机排序reverse:逆序原容器reverse:逆序容器到新容器rotate:移动元素到容器末尾rotate_copy:移动元素到新容器
#include
#include
#include
#include
#include
#include
using namespace std;
template
void print(_Ty data)
{
for (auto v : data)
{
cout << v << " ";
}
cout << endl;
}
class Mouse {
public:
string getName()
{
return name;
}
int getAge()
{
return age;
}
void print() {
cout << name << " " << age << endl;
}
Mouse(string name,int age):name(name),age(age){}
protected:
string name;;
int age;
};
void testUserData() {
vectorMickey;
Mickey.push_back(Mouse("abc", 12));
Mickey.push_back(Mouse("cad", 56));
Mickey.push_back(Mouse("hjk", 23));
sort(Mickey.begin(), Mickey.end(), [](auto a, auto b) {return a.getName() > b.getName(); });
for (auto v : Mickey) {
v.print();
}
}
bool compare(double a,double b) {
return (int)avec = { 1.33,2.33,1.22,3.22,3.55,4.22 };
//stable_sort:排序,保存原容器顺序排序
stable_sort(vec.begin(), vec.end(), compare);
print(vec);
//stable_partition:范围排序,保存原容器相对排序
stable_partition(vec.begin(), vec.end(), bind(compare,std::placeholders::_1,2.0));
print(vec);
}
void testMerge() {
vectorvec = { 1,2,3,4,5,0,6,7,8,9 };
vectorresult(vec.size());
//merge:归并排序,存于新容器
merge(vec.begin(), vec.begin() + 5, vec.begin() + 5,vec.end(), result.begin());
print(vec);
//inplace_merge:归并排序,覆盖原区间
inplace_merge(vec.begin(), vec.begin() + 5, vec.end());
print(vec);
}
int main() {
testMerge();
testUserData();
testStableSort();
//sort:排序,更改原容器排序
vectorvec = { 1,2,3,4,1,2,3,5 };
sort(vec.begin(), vec.end());
sort(vec.begin(), vec.end(),less());
print(vec);
sort(vec.begin(), vec.end(), greater());
print(vec);
//nth_element:关键字排序
vectortest = { 1,2,3,4,5,0,6,7,8,9 };
nth_element(test.begin(), test.begin() + 5, test.end());
print(test);
//partition:分类处理,通过子函数描述条件,返回true放左边,返回false放右边
vectorscore = { 98,97,95,20,56,43 };
partition(score.begin(), score.end(), [](int a) {return a > 60; });
print(score);
//partial_sort:范围排序
partial_sort(score.begin(), score.begin() + 3, score.end());
print(score);
//partial_sort_copy:局部排序,结果另存
vectorresult(5);
partial_sort_copy(vec.begin(), vec.begin() + 5, result.begin(), result.end());
print(result);
//random_shuffle:随机排序
srand((unsigned int)time(nullptr));
random_shuffle(vec.begin(), vec.end());
print(vec);
//reverse:逆序原容器
reverse(vec.begin(), vec.end());
print(vec);
//reverse:逆序容器到新容器
vectorre(vec.size());
reverse_copy(vec.begin(), vec.end(), re.begin());
print(re);
//rotate:移动元素到容器末尾
vectorrome = { 1,35,5,6,3 };
rotate(rome.begin(), rome.begin() + 2, rome.end());
print(rome);
//rotate_copy:移动元素到新容器
vectormResult(rome.size());
rotate_copy(rome.begin(), rome.begin() + 3, rome.end(), mResult.begin());
print(mResult);
return 0;
}
删除算法
merge:归并排序,存于新容器inplace_merge:归并排序,覆盖原区间sort:排序,更改原容器排序stable_sort:排序,保存原容器顺序排序nth_element:关键字排序partition:范围排序partial_sort:范围排序partial_sort_copy:局部排序,结果另存stable_partition:范围排序,保存原容器排序random_shuffle:随机排序reverse:逆序原容器reverse:逆序容器到新容器rotate:移动元素到容器末尾rotate_copy:移动元素到新容器
#include#include #include #include #include #include using namespace std; template void print(_Ty data) { for (auto v : data) { cout << v << " "; } cout << endl; } class Mouse { public: string getName() { return name; } int getAge() { return age; } void print() { cout << name << " " << age << endl; } Mouse(string name,int age):name(name),age(age){} protected: string name;; int age; }; void testUserData() { vector Mickey; Mickey.push_back(Mouse("abc", 12)); Mickey.push_back(Mouse("cad", 56)); Mickey.push_back(Mouse("hjk", 23)); sort(Mickey.begin(), Mickey.end(), [](auto a, auto b) {return a.getName() > b.getName(); }); for (auto v : Mickey) { v.print(); } } bool compare(double a,double b) { return (int)a vec = { 1.33,2.33,1.22,3.22,3.55,4.22 }; //stable_sort:排序,保存原容器顺序排序 stable_sort(vec.begin(), vec.end(), compare); print(vec); //stable_partition:范围排序,保存原容器相对排序 stable_partition(vec.begin(), vec.end(), bind(compare,std::placeholders::_1,2.0)); print(vec); } void testMerge() { vector vec = { 1,2,3,4,5,0,6,7,8,9 }; vector result(vec.size()); //merge:归并排序,存于新容器 merge(vec.begin(), vec.begin() + 5, vec.begin() + 5,vec.end(), result.begin()); print(vec); //inplace_merge:归并排序,覆盖原区间 inplace_merge(vec.begin(), vec.begin() + 5, vec.end()); print(vec); } int main() { testMerge(); testUserData(); testStableSort(); //sort:排序,更改原容器排序 vector vec = { 1,2,3,4,1,2,3,5 }; sort(vec.begin(), vec.end()); sort(vec.begin(), vec.end(),less ()); print(vec); sort(vec.begin(), vec.end(), greater ()); print(vec); //nth_element:关键字排序 vector test = { 1,2,3,4,5,0,6,7,8,9 }; nth_element(test.begin(), test.begin() + 5, test.end()); print(test); //partition:分类处理,通过子函数描述条件,返回true放左边,返回false放右边 vector score = { 98,97,95,20,56,43 }; partition(score.begin(), score.end(), [](int a) {return a > 60; }); print(score); //partial_sort:范围排序 partial_sort(score.begin(), score.begin() + 3, score.end()); print(score); //partial_sort_copy:局部排序,结果另存 vector result(5); partial_sort_copy(vec.begin(), vec.begin() + 5, result.begin(), result.end()); print(result); //random_shuffle:随机排序 srand((unsigned int)time(nullptr)); random_shuffle(vec.begin(), vec.end()); print(vec); //reverse:逆序原容器 reverse(vec.begin(), vec.end()); print(vec); //reverse:逆序容器到新容器 vector re(vec.size()); reverse_copy(vec.begin(), vec.end(), re.begin()); print(re); //rotate:移动元素到容器末尾 vector rome = { 1,35,5,6,3 }; rotate(rome.begin(), rome.begin() + 2, rome.end()); print(rome); //rotate_copy:移动元素到新容器 vector mResult(rome.size()); rotate_copy(rome.begin(), rome.begin() + 3, rome.end(), mResult.begin()); print(mResult); return 0; }
copy:拷贝函数copy_backward:逆序拷贝iter_swap:交换remove:删除remove_copy:删除元素复制到新容器remove_if:条件删除remove_copy_if:条件删除拷贝到新容器replace:替换replace_copy:替换结果放新容器replace_if:条件替换replace_copy_if:条件替换,结果另存swap:交换swap_ranges:区间交换unique:去重unique_copy:去重结果另存
#include#include #include #include #include #include using namespace std; template
void print(_Ty data) { for (auto v : data) { cout << v << " "; } cout << endl; } int main() { //正向拷贝 vector vec = { 1,2,3,4,5,6 }; vector renc(vec.size()); copy(vec.begin(), vec.end(), renc.begin()); print(renc); //逆向拷贝,从最后开始赋值 vector rvec(vec.size()); copy_backward(vec.begin(), vec.end(), rvec.end()); print(rvec); //删除-->伪删除 auto iter = remove(vec.begin(), vec.end(), 3); cout << vec.size() << endl; print(vec); //伪删除,结果另存 vector result(vec.size()); remove_copy(vec.begin(), vec.end(), result.begin(), 2); print(result); //条件删除,remove_if vector score = { 98,65,87,32,56 }; remove_if(score.begin(), score.end(), [](int x) {return x < 60; }); print(score); //条件删除,结果另存 vector IU(count_if(score.begin(), score.end(), [](int x) {return x > 60; })); remove_copy_if(score.begin(), score.end(), IU.begin(), [](int x) {return x < 60; }); print(IU); //替换算法(修改)replace vector rep = { 1,2,3,4,5,1,6,1,4,8 }; replace(rep.begin(), rep.end(), 1, 100); print(rep); //替换后结果另存 vector recp(rep.size()); replace_copy(rep.begin(), rep.end(), recp.begin(), 100, 0); print(recp); //条件交换 replace_if(rep.begin(), rep.end(), [](int x) {return x < 6; }, 0); print(rep); //条件替换,结果另存 vector repif(rep.size()); replace_copy_if(rep.begin(), rep.end(), repif.begin(), [](int x) {return x == 0; },1); print(repif); //交换iter_swap vector test = { 1,2,34,5,6,6 }; iter_swap(test.begin(), test.end() - 1); print(test); //swap不需要两个容器长度一样 vector test1 = { 2,2 }; swap(test, test1); print(test1); print(test); //区间交换swap_ranges swap_ranges(test1.begin(), test1.begin() + 1, test.begin()); print(test1); //去重(连续相同的只保留一个) vector uniq = { 1,1,3,3,4,4,5,66,7 }; print(uniq); //去重另存 vector uniqr(6); unique_copy(uniq.begin(), uniq.end(), uniqr.begin()); print(uniqr); return 0; }



