简述STL之萃取器

萃取器在C++的STL中扮演重要角色,它扩展了迭代器的功能,允许我们获取迭代器指向数据的类型,如value_type、pointer、reference等。通过模板参数推导和迭代器的偏特化版本,萃取器解决了原生指针和类类型迭代器的类型获取问题。difference_type用于表示迭代器间距离,iterator_category则标识迭代器的能力,如input、output、forward、bidirectional和random access。STL算法会根据iterator_category选择合适的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

萃取器相当于对迭代器的功能扩展,有了它让我们得以通过迭代器获得迭代器所指的数据的类型。

现在假设我们要实现一个算法,它接受一个迭代器作为参数,算法中需要定义一个变量,类型为迭代器所指的数据的类型。

对于这个问题,我们并没有什么好办法,C++没有typeof()这种东西,typeid()也只能获得关于类型的信息,并不能用来声明变量。

不过我们还是可以仰仗function templete的参数推导来完成这个任务。

template<class I,class T>
void func_impl(I iter,T t)
{
    T tmp;
    //do something
}

template<class I>
void func(I iter)
{
    func_impl(iter,*iter);
}

int main ()
{
    int i;
    func(&i);
}

把func()当成一个接口,把实际要做的工作放在func_impl中去做,编译器自动帮我们推导出了T,解决了问题。

可是这种方法有很大的缺陷,首先它很麻烦,其次如果我要把T类型当成函数的返回值,无论怎样这种方法都是没法解决问题的,我们只能另寻出路。

新的方法是在迭代器的定义中做手脚。

template<class T>
struct MyIter
{
    typedef T value_type;
    T* ptr;
    //...
};

template <class I>
typename I::value_type func(I ite)
{
    return *ite;
};

在迭代器的定义里加了一行typedef问题就解决了,函数的返回值被设置为typename I::value_type,加typename的原因是告诉编译器value_type

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值