【足迹C++primer】32、定制操作_1

定制操作

向算法传递函数

用 sort 接受第三个参数!!

谓词

bool isShorter(const string &s1, const string &s2)
{
    return s1.size()<s2.size();
}

int main()
{
    //按长度由短至长排序words
    sort(words.begin(), words.end(), isShorter);
}

这个words里面是一个string类型的数组,这个调用会是将words重排,所有长度为3的单词排在长度为4的前面,然后是长度为5的单词。

排序算法

看来排序很重要啊!最近老碰到排序,冒泡排序什么的已经很熟悉啦,选择排序不太清楚,什么二分啦,快排啦,哈希啦,就只是知道思路,得努力啊!!!

    vector<string> words={"fox","jumps","over","quick","red","red","slow","the","the","turtle"};
    //按长度由短至长排序words
    sort(words.begin(), words.end(), isShorter);
    elimDups(words);    //将words按字典序重排,并消除重复单词
    //按长度重排,长度一样按字典
    stable_sort(words.begin(), words.end(), isShorter);

    for(const auto &s : words)  //无需拷贝字符串
        cout<<s<<" ";   //打印每个元素
    cout<<endl;

习题:

//调用算法进行排序打印长度大于5的元素
    auto it=partition(words.begin(), words.end(), isLong);
    //返回的是使谓词为true的最后一个迭代器
    cout<<"输出长度大于等于5的字符!!"<<endl;
    for(vector<string>::iterator st=words.begin() ; st != it ; ++st)
        cout<<*st<<" ";
    cout<<endl;

lambda表达式

要是没次要输出大于几就改有点麻烦是吧,那就把谓词给它来个百八十个!!!

获取一个迭代器,指向第一个满足size()>=sz的元素

计算满足size>=sz的元素的数目

打印长度大于给定值的单词,每个单词后面接一个空格

这里可以用find_if,嘿嘿!!又来了好东西了,大家是不是感觉幸福来的太突然!!!

find_if接受一对迭代器,表示一个范围,查找有特定大小的元素。

可是啊,这里find_if每次也只能接受一个参数,没法接受一个序列!!!!

这么办呢???

介绍lambda

目前就两种可调用对象,分别是:函数、函数指针!!!函数指针是干嘛的?

其实还有两种:重载了函数调用运算符的类,和 嘿嘿,又来了,每次揭晓答案的时候总是忍不住调皮一下

那就是:lambda表达式

[capture list] (parameter list)  -> return type{function body}

诺,这就是那玩意的表现形式。

//是不是有点不一样,这里定义了可调用对象f,它不接受参数,返回42
auto f=[] {return 42;};
    //看哥调用它
    cout<<f()<<endl;

这里如果lambda的函数体包含任何单一return语句之外的内容、且为指定返回类型,则返回void类型

向lambda传递参数,使用捕获列表

stable_sort(words.begin(), words.end(), [] (const string &a, const string &b)
{return a.size()<b.size();})
void fcn1()
{
    vector<string> words={"fox","jumps","over","quick","red","red","slow","the","the","turtle"};
    size_t v1 = 42;
    //获取一个迭代器,指向第一个满足size()>=v1的元素
    auto wc=find_if(words.begin(), words.end(), [v1](const string &a){return a.size()>=v1;});

}
void fcn2()
{
    vector<string> words={"fox","jumps","over","quick","red","red","slow","the","the","turtle"};
    size_t v1 = 42;
    //获取一个迭代器,指向第一个满足size()>=v1的元素
    auto wc=find_if(words.begin(), words.end(), [v1](const string &a){return a.size()>=v1;});
    //计算满足size>=sz的元素的数目
    auto count=words.end()-wc;

    cout<<count<<" "<<make_plural(count, "word", "s")
        <<" of length "<<v1<<" or longer "<<endl;

    //for_each算法
    for_each(wc, words.end(),[](const string &s){cout<<s<<" yeah! ";});
}

【足迹C++primer】32、定制操作_1

时间: 2024-08-29 20:38:45

【足迹C++primer】32、定制操作_1的相关文章

【足迹C++primer】32、定制操作_2

定制操作_2 完整的biggies 好吧上一章是有点2B了,我的,昨天可能是刚考完心情有点小激动就不想学习了,我错了!! /** * 功能:定制操作 * 时间:2014年6月19日07:32:03 * 作者:cutter_point */ #include<iostream> #include<vector> #include<string> #include<numeric> #include<algorithm> using namespac

【足迹C++primer】38、关联容器操作(2)

关联容器操作(2) map的下标操作 map的下标操作 map和unordered_map容器提供了下标运算符合一个对应的at函数 对于一个map使用下标操作,其行为与数组或vector上的下标操作很不相同: 使用一个不再容器中的关键字作为下标,会添加一个此关键字的元素到map中 map和unordered_map的下标操作 c[k] 返回关键字为k的元素,如果关键字k不再c中,添加一个关键字为k的元素,对其进行值初始化 c.at(k) 访问关键字为k的元素,带参数检测,如果k不再c重那么返回一

【足迹C++primer】28、额外的string操作

额外的string操作 构造string的其他方法 //n, len2, pos2 都是无符号值 string s(cp, n) //s是cp指向的数组中前n个字符的拷贝.此数组至少应该包含n个字符 string s(s2, pos2) //s是string s2从下标pos2开始的字符的拷贝. string s(s2, pos2, len2) //s是s2从pos2开始Len2个字符 const char *cp="Hello World!!!"; //以空字符结束的数组 char

【足迹C++primer】26、顺序容器操作

顺序容器操作 向顺序容器添加元素 forward_list //有自己专有版本的insert和emplace: forward_list //不支持push_back和emplace_back vector, string //不支持push_front和emplace_front c.push_back(t), c.emplace_back(args) //在c的尾部创建一个值为t的或者由args创建的元素,返回void c.push_front(t), c.emplace_back(args

【足迹C++primer】44、交换操作

交换操作 class HasPtr { friend void fun2(); friend void swap(HasPtr&, HasPtr&); public: // HasPtr()=default; HasPtr(const string &s=string()):ps(new string(s)), i(0){} //对ps指向的string,每个HasPtr对象都有自己的拷贝 HasPtr(const HasPtr &p):ps(new string(*p.p

【足迹C++primer】38、关联容器操作(1)

关联容器操作 关联容器中还定义了三个类型,如下: set<string>::value_type v1; //这个v1是string类型 set<string>::key_type v2; //这个v2是string类型 map<string, int>::value_type v3; //v3是pair类型pair<const string, int> map<string, int>::key_type v4; //v4是string类型 m

【足迹C++primer】表达式求值

表达式求值 /** * 功能:表达式求值(0到9) * 时间:2014年6月15日08:02:31 * 作者:cutter_point */ #include<stdlib.h> #include<stack> #include<iostream> #include<string> using namespace std; stack<int> intStack; //存放数值的栈 stack<char> charStack; //存

【足迹C++primer】27、vector对象是如何增长的

vector对象是如何增长的 当需要更多空间的时候,会重新分配比新空间需求更大的内存空间,作为备用 管理容器的成员函数 shrink_to_fit //只适用于vector,string,deque capacity reserve //只适用于vector,string c.shrink_to_fit() //请将capacity()减少为与size相同大小 c.capacity() //不重新分配内存空间的话,c可以保存多少元素 c.reserve(n) //分配至少能容纳n个元素的内存空间

【足迹C++primer】31、初识泛型算法

初识泛型算法 理解算法的最基本方法是了解他们是否读取元素.改变元素或是重排元素顺序! 只读算法 #include<iostream> #include<numeric> using namespace std; //对vec中的元素求和,初值是0 int sum=accumulate(vec.cbegin(), vec.cend(), 0); 这里面第三个参数决定了函数使用哪个加法运算符以及返回值类型. 算法和元素类型 string sum=accumulate(v.cbegin(