C++编程风格

本文详细探讨了C++编程中的两种主要风格:泛型编程和基于对象的编程。在泛型编程中,重点讲解了指针、泛型指针(Iterator)、泛型算法的设计与应用,以及如何使用map和set。在基于对象的编程部分,介绍了类、构造函数、析构函数、成员初始化列表、拷贝构造以及运算符重载的概念。此外,还涉及了friend关键字、静态成员以及如何实现一个function object。
摘要由CSDN通过智能技术生成

编程风格:泛型编程风格,基于对象的编程风格


一.泛型编程风格

1.指针的算术运算

vectorarray等内存连续的容器进行取值操作:

函数传入参数的不同类型  ---- 模板

内存连续  ---- 指针

通过模板和指针的结合构造出对容器的取值算法:

template <typename elemType>
elemType* find(const elemType* first,const elemType* last,const elemType* value)
{
    if(!first||!last)
    {
        return 0;
    }
    for(;first!=last;++first)
        if(*first == value)
            {
                return first;
            }
    return 0;
}

 


2.了解Iterator(泛型指针)

list等内存非连续的容器进行遍历输出操作:(list的元素以一组指针相互链接:前项指针指向下一个元素,后向指针指向上一个元素。无法通过指针的++来对元素的访问)

使用泛型指针,使其指向容器开头,便依然可以使用++等符号对元素进行遍历操作。

list<string> svec;
list<string>::iterator iter = svec.begin;//利用泛型指针指向容器的开头

template <typename elemType>
void display(const list<elemType>& vec)
{
    list<elemType>::const_iterator iter = vec.begin();
    list<elemType>::const_iterator end_it = vec.end();

    //如果vec是空的,iter便等于end_it
    for(;iter!=end_it;iter++)
    {
        cout<<*iter<<' ';
    }
    cout<<endl;
}

 利用泛型指针来对list容器进行查值:

template<typename IteratorType,typename elemType> 
IteratorType find1(IteratorType first,IteratorType last,const elemType& value)
{
    for(;first!=last;++first)
        if(value == *first)
            return first;
    return last;
}
int main()
{
    const int asize = 8;
    int ia[asize] = {1,1,2,3,5,8,13,21};
    list<int> ilist(ia,ia+asize);
    list<int>::iterator iter;
    iter = find1(ilist.begin(),ilist.end(),8);
    if(iter != ilist.end())
        cout<<"找到了";
    return 0;
}

 泛型算法列举:

 

 


顺序容器包括:vectorlistdeque等。

 

容器还提供了一些特别的函数:push_back()会在末端插入一个元素,pop_back() 会删除最后一个元素。除此之外,listdeque还提供了push_front()pop_front() 来对容器第一个元素进行增删。

#include<deque>
int main(){
	deque<int> a_line;
	int ival;
	while(cin>>ival){
		//将ival插入a_line末端
		a_line.push_back(ival);
		
		//读取a_line最前端元素的值
		int curr_value = a_line.front();
		
		//...进行操作
		
		//删去a_line最前端元素
		a_line.pop_front(); 
	}
	return 0;
}

 如果要访问需要直接使用front()back()函数。中间插入则是insert()函数。书上还列举了insert()的几种变形。


4. 使用泛型算法

使用泛型算法的要求:

#include<algorithm>

泛型搜索算法:

1.find() 用于搜索无序集合中是否存在某值。

2.binary_search()用于有序集合的搜索。

3.count() 返回数值相符的元素数目。

4.search() 比对某个容器内是否存在某个子序列。

其余泛型算法:

1.max_element() 返回数列中的最大值。

2.copy() 对容器内的数值进行复制。


5.如何设计一个泛型算法

我们用一个例子来说明如何设计一个泛型算法:

现在我们需要制作一个过滤器,过滤掉一个容器中的一些数据,例如:找出容器中大于10的数据并存入别的容器中。而这大于10都是可变的,是由我们自己设定的。示例如下:

#include<iostream>
#include<vector>
using namespace std;
//小于 
bool less_than(int va1,int va2){
	return va1<va2?true:false;
}
//大于
bool greater_than(int va1,int va2){
	return va1>va2?true:false; 
}
//过滤器函数,参数;被过滤容器,过滤判断值,函数指针(大于或小于)
 vector<int> filter_ver1(const vector<int>& vec,int filter_value,bool (*pred)(int,int))
 {
 	vector<int> nvec;
 	for(int ix = 0;ix < vec.size(); ++ix){
 		if(pred(vec[ix],fiter_value))
 			nevc.push_back(vec[ix]);
	 }
	 return nvec;
 }
 
 int main(){
 	vector<int> big_vec;
 	int value;
 	big_vec={1,2,3,4,5,6,7,8,9,10};
 	value = 5;
 	vector<int> It_10 = filter_ver1(big_vec,value,less_than);
 	for(int i = 0;i < It_10.size(); i++){
 			cout<<It_10[i]<<" ";
		}
	cout<<endl;
 	return 0;
 }

 


function object

某种class的实例对象,对function call运算符做了重载操作,能让function object当成一般函数来用,这样可以提升效率。
function object实现了我们原本自定义一个函数才能实现的东西
标准库中事先定义了一组function object,比如plus<type(内置类型或class类型>,less<type>,logical_and<type>等,六个算术运算,六个关系运算,三个逻辑运算。
注意使用function object的时候,要包含头文件#include<functional>

function object a

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值