这是2的笔记
//删除字符串空白符
#include <iostream>
#include <numeric>
#include <functional>
#include <string>
#include <algorithm>
using namespace std;
string trim_left(string s)
{
s.erase(s.begin(), find_if(s.begin(), s.end(), !' '/*is_not_space*/));
//在这里留下一个疑问,书上并没有写is_not_space 的define,那究竟如何表达呢?我感觉和我写的是等价,但是无法运行
return(s);
}
int main()
{
string s = " dfdfesdfc";
cout << trim_left(s) << endl;
}
string trim_right(string s)
{
s.erase(find_if(s.rbegin(), s.rend(), !' ').base(),s.end());//这一行代码不是很懂,base()是什么意思
return(s);
}
这是1的笔记
//新思路:FP vector求平均值
#include <iostream>
#include <vector>
#include <numeric>
#include <functional>
#include <algorithm>
#include <string>
using namespace std;
double average_score(const vector<int>& scores)//新的vector<int>向量中引入scores向量
{
int sum = 0;
for (int score : scores) {//取完scores内所有元素,并且将每个元素在循环内都命名为score
sum += score;
}
return sum / (double)scores.size();
}
double average_score_fp(const vector<int>& scores)//利用STL,numeric库去进行FP求平均值
{
return (double)accumulate(scores.cbegin(), scores.cend(), 0) / scores.size();
}
double scores_product(const vector<int>& scores)//利用STL,functional库去FP相乘(作为accumulate的算子)
{
return accumulate(scores.cbegin(), scores.cend(), 1, multiplies<int>());
}
void know_multiplies(void)//实现两个向量内数字分别相乘
{
vector<int> v1 = { 10, 20, 30, 40, 50 };
vector<int> v2 = { 1, 2, 3, 4, 5 };
vector<int> result(5);
transform(v1.begin(), v1.end(), v2.begin(), result.begin(), multiplies<int>());
for (int i : result) {
cout << i << " ";
}
cout << std::endl;
return;
}
//以下为统计换行符的程序,帮助理解accumulate的折叠算法
int help(int previous_count, char c)
{
return (c != ' ') ? previous_count : previous_count + 1;
}
int count_space(const string& s) {
return accumulate(s.cbegin(), s.cend(), 0, help);
}
int main() {
/*
int a[6] = { 1,2,3,4,5,6 };
vector<int> b;
for (int i = 0; i <= 5; i++)
b.push_back(a[i]);//push_back的意思是尾部添加
cout<<average_score_fp(b)<<endl;
know_multiplies();
*/
cout<<count_space("fuck you bitch")<<endl;
return 0;
}
//如果要进行右折叠,可以使用crbegin和crend的方法(c_reverse_begin)