C++算法与泛型算法(algorithm、numeric)

2020-02-20 12:00:58王冬梅

vector<int> vec{ 1,4,2,8,4,1 };
sort(vec.begin(), vec.end()); //将vec的值从小到大排序
 
for (auto v = vec.cbegin(); v != vec.cend(); v++) {
 cout << *v << endl;
}

unique()

相邻之间如果有重复相同的元素,则删除重复的元素只保留一个 参数:一个容器的迭代器范围 返回值:返回删除重复元素之后的最后一个元素的后一个位置 注意(重点):虽然删除了元素,但是容器的大小依然没有变,迭代器也没有变。所有变为迭代器时一定要注意

vector<int> vec{ 1,1,2,3,4,4,4,5,1 };
auto end_unique=unique(vec.begin(), vec.end());
 
//for循环时使用unique的返回值,如果使用vec.cend(),那么会打印后面没有元素位置的乱值
for (auto v = vec.cbegin(); v != end_unique; v++) { 
	cout << *v << endl;
}

stable_sort()

也是排序 如果非字符串,就先按照数值的个数排序,个数相同时再按照大小排序 如果是字符串:按照长度排序,长度相同的按照字典排序
vector<int> vec{ 1,10,2,100,4,1 };
stable_sort(vec.begin(), vec.end());
 
//1,1,2,4,10,100
for (auto v = vec.cbegin(); v != vec.cend(); v++) {
 cout << *v << endl;
}

六、向算法传递函数和lambda表达式

注意事项:

向算法传递函数或者lambda表达式时要注意。该算法支持调用一元谓词(参数)还是多元谓词(参数)

例如:find_if的第3个参数传递的函数/lambda只接受一个参数,如果是两个参数的函数或lambda,那么就不能调用(后面会介绍bind函数解决这个问题)

sort()

bool isMin(const int &s1, const int & s2) {
 return s1 < s2;
}
 
bool isMax(const int &s1, const int & s2) {
 return s1 > s2;
}
 
vector<int> vec{1,2,3,4,5};
sort(vec.begin(), vec.end(), isMin); //从小到大排序
sort(vec.begin(), vec.end(), isMax); //从大到小排序
 
//使用lambda表达式
sort(vec.begin(), vec.end(),
 [](const int &a, const int &b) {return a < b; });//从小到大排序
sort(vec.begin(), vec.end(), 
 [](const int &a, const int &b) {return a > b; });//从大到小排序

stable_sort()

//按照长度排序,长度相同的按照字典排序
bool isShorter(const string &s1, const string & s2) {
	return s1.size() < s2.size();
}
 
vector<string> vec{"fox","jumps","over","quick","res","slow","the","turtle"};
stable_sort(vec.begin(), vec.end(), isShorter);
 
for (auto v = vec.cbegin(); v != vec.cend(); v++) {
	cout << *v << endl;
}

find_if()

用来在指定范围内查找比指定值大/下的元素 如果是大于(那么就是最大的那个)。如果是小于(那么就是比他小一个的那个) 参数3:为一个函数指针或者lambda表达式 返回值:存在就返回这个值,不存在返回尾迭代器