本博客知识记录自己学习中的笔记或者记录,如果有错误欢迎大家纠正。
本节初步了解泛型算法。
算法不能改变容器大小,切记
10.11编写程序,使用stable_sort和isShorter将传递给你的elimDups版本的vector排序,打印vector的内容,验证程序的正确性
代码如下
#include <vector>
#include <string>
#include "stdlib.h"
#include <iostream>
#include <iterator>
#include <algorithm>
//打印出容器中的数据
void pritef(std::vector<std::string> &word)
{
for (auto s : word)
std::cout << s << " ";
std::cout << std::endl;
}
//比较函数,用来按长度排序
bool isShorter(const std::string &s1, const std::string &s2)
{
return s1.size() < s2.size();
}
void elimDups(std::vector<std::string> &word)
{
//按字典排序
sort(word.begin(), word.end());
//重排在范围的前部,返回指向不重复区域之后一个位置的迭代器。
auto end_unique = unique(word.begin(), word.end());
//使用容器操作erase删除后面的单词
word.erase(end_unique, word.end());
}
int main()
{
std::vector<std::string>vec;
std::string s = "";
while (std::cin >> s)
vec.push_back(s);
elimDups(vec);
//按指定的排序规则(isShorter)排序
stable_sort(vec.begin(), vec.end(), isShorter);
pritef(vec);
//暂停系统
system("pause");
return 0;
}
输出结果为
10.12 编写名为compareIsbn函数,比较两个Salse_data对象的isbn()成员,是这个函数排序一个保存Sales_data对象的vector。
//头文件
#include <iostream>
class Sales_data
{
public:
Sales_data();
~Sales_data();
//对输入流进行重载 记得要用做友函数
friend inline std::istream & operator >> (std::istream & is, Sales_data &salesbook){
is >> salesbook.ISBN;
is >> salesbook.units_sold;
is >> salesbook.revenue;
return is;
}
//成员变量,方便调用定位public
std::string ISBN;
unsigned int units_sold;
double revenue;
};
Sales_data::Sales_data()
{
//构造函数初始化成员变量
ISBN = "";
units_sold = 0;
revenue = 0.0;
}
Sales_data::~Sales_data()
{
}
//源文件
#include <vector>
#include <string>
#include "stdlib.h"
#include <iostream>
#include <iterator>
#include <algorithm>
#include "10.12.h"
void pritef(std::vector<Sales_data> &word)
{
for (auto s : word)
std::cout << s.ISBN<<" "<<s.revenue<<" " <<s.units_sold <<std::endl;
std::cout << std::endl;
}
bool isShorter(const Sales_data &s1, const Sales_data &s2)
{
//按isbn长短排序
return s1.ISBN.size() < s2.ISBN.size();
}
int main()
{
Sales_data book;
std::vector<Sales_data>vecSale;
while (std::cin >> book)//使用重载后的 输入流输入自定义对象
vecSale.push_back(book);
//指定排序规则 进行排序
stable_sort(vecSale.begin(), vecSale.end(), isShorter);
pritef(vecSale);
system("pause");
return 0;
}
输出结果为
10.13标准库中定义了名为partition的算法,它接收一个谓词,对容器内容精选划分,使得谓词为true的值会排在容器前半段,而使谓词为false的值会排在后半段,算法返回一个迭代器,指向最后一个使谓词为true
的元素之后的位置位置。编写函数,接收string返回一个bool值,指出string是否有5个或者更多的字符,使用此函数划分words,打印长度大于五的函数。
#include <vector>
#include <string>
#include "stdlib.h"
#include <iostream>
#include <iterator>
#include <algorithm>
//比较函数
bool isShorter(const std::string &s1)
{
//三目运算符,计算string.size是否大于等于5,大于等于返回真
return s1.size() >= 5 ? true : false;
}
int main()
{
std::vector<std::string>vecString;
std::string s = "";
//输入数据到容器中
while (std::cin>>s)
{
vecString.push_back(s);
}
//得到最后一个满足条件的
auto last_true = partition(vecString.begin(), vecString.end(), isShorter);
//使用迭代器 限定范围在开始到最后一个为真的位置
for (std::vector<std::string>::iterator it = vecString.begin(); it < last_true; it++)
std::cout << *it << std::endl;
system("pause");
return 0;
}
仅供学习参考谢谢。