STL源码剖析笔记(迭代器)

《STL源码剖析》学习之迭代器 在设计模式中有一种模式叫迭代器模式,简单来说就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素,这种设计思维在STL中得到了广泛的应用,是STL的关键所在,通过迭代器,容器和算法可以有机的粘合在一起,只要对算法给予不同的迭代器,就可以对不同容器进行相同的操作。 阅读详情

STL经常需要获取迭代器型别来进行一系列算法设计,简单总结一下书所对于型别推导提到的思想

迭代器获取其所指元素的型别

  1. 1.

一 利用 function template 的自变量推导( argument deducation)机制。

template <class I, class T>
void func_impl(I iter, T t)
{
 T tmp; // 这里解决了问题。 T就是迭代器所指之物的型别,ᴀ例为 int
// ... 这里做原ᴀ func() 应该做的全部工作
};
template <class I>
inline void func(I iter)
{
 func_impl(iter, *iter); // func 的工作全部移往 func_impl
}
int main()
{
 int i;
 func(&i);
}

使用func()来包装func_impl(),func函数对外。只要调用func()便可以通过func_impl推导出型别T。但是这中方法并不健全,当func的参数为函数返回值就行不通了。
-
2.

声明内嵌型别

template <class T>
struct MyIter
 typedef T value_type; 
 T* ptr;
 MyIter(T* p=0) : ptr(p) { }
 T& operator*() const { return *ptr; }
 // ...
};
template <class I>
typename I::value_type   func(I ite)
{ return *ite; }
// ...
MyIter<int> ite(new int(8));
cout << func(ite); //输出: 8

但是 实际上 要使迭代器有内嵌型别,迭代器本身就必须是一个struct或者class,但是像原生指针并不是class这种类型就无法定义内嵌型别,因此通过3
3.

偏特化

template<typename T>  //1
class C { ... };  

template<typename T>  //2
class C<T*> { ... };  

如上,2为1偏特化,可以通过2设计T指针的偏特化迭代器。解决了指针无法定义内嵌型别的问题。

关于traits ,这个地方比上面难理解一些 多写一点
首先需要明白traits 解决的问题,对于T
举个例子 如果我要实现一个模板类,在这个模板类实现一个函数sum()来计算两个成员变量的和,其中两个成员变量均为T类型。sum要求如下

1当T为float类型时候,要求sum()返回类型为int
2当T为其他类型的时候,要求sum( )返回类型为T

如果只是单纯实现2的话,很容易做到,但是1的话不属于2范围,这时候就需要用到偏特化。
实现如下

#include<iostream>
template <typename T>
struct  Traits{
    typedef T _type;

};
template<>
struct  Traits<float>{
    typedef int _type;
};

template <typename T>
class A
{
public:
  A(T a,T b):data_a(a),data_b(b){};
  typename Traits<T>::_type sum(){return data_a+data_b;}

private:
  T data_a,data_b;
};



int main()
{
    A<double>Obj_d(1.3,1.5);
    A<float>Obj_f(1.3,1.5);
    std::cout<<Obj_d.sum()<<"  "<<Obj_f.sum();  //输出为2.8   2
    return 0;
}

理解了traits的本意,那么我们可以对T* 进行偏特化,并通过trait取出value(T)类型来定义func2,同样也适用于const T*

#include<iostream>

using namespace std;
template <class T>
struct MyIter{
    typedef T Iter_type;
    T* ptr;
    MyIter(T* p=0):ptr(p){}
    T& operator*() const{
        return *ptr;
    }
};
template <class T>
struct MyIter<T*>{
    typedef T Iter_type;
    T* ptr;
    MyIter(T* p=0):ptr(p){}
    T& operator*() const{
        return *ptr;
    }
};

template<class T>
struct traits{
    typedef typename T::Iter_type traits_type;
};

template<class T>
struct traits<T*>{
    typedef  T traits_type;
};

//template<class T>
//struct traits<const T*>{
//    typedef T traits_type;
//};

template <class I>
typename traits<I>::traits_type func(I iter){
    return *iter;
}


int main(){
    MyIter<int>iter1(new int(8));
    MyIter<int*>iter2(new int(8));
    cout<<func(iter1)<<endl<<func(iter2);
}



迭代器

5个内嵌类型

  • value type 用来表示迭代器所指对象的型别;
  • difference type 用来表示两个迭代器之间的距离;
  • reference 为引用类型;
  • pointer 为指针类型;
  • iterator_category 表明迭代器的类型

迭代器的五种类型
1. Input Iterator:这种迭代器所指对象,不允许外界改变,只读(read only);
2. Output Iterator:唯写(write only);
3. Forward Iterator:允许「写入型」算法(例如 replace())在此种迭代器所形成的区间上做读写动作;
4. Bidirectional Iterator:可双向移动。某些算法需要逆向走访某个迭代器区间(例如逆向拷贝某范围内的元素),就可以使用 Bidirectional Iterators;
5. Random Access Iterator:前四种迭代器都只供应一部份指标算术能力(前3
种支持 operator++ ,第4种再加上 operator–),第5种则涵盖所有指标算术能力,包括 p+n, p-n, p[n], p1-p2, p1

这里写图片描述
通过继承机制,

 struct input_iterator_tag { };
 struct output_iterator_tag { }; 
 struct forward_iterator_tag : public input_iterator_tag { }; 

 struct bidirectional_iterator_tag : public forward_iterator_tag { }; 

 struct random_access_iterator_tag : public bidirectional_iterator_tag { };

以上结构体仅作为标记存在,通过一个作为标记参数来重载函数
对外接口使用traits机制,在编译期确定调用的重载函数。




__type_traits

traits的其他用途,用于获取是否有如下内容,提高在程序运行期的效率。
has_trivial_default_constructor;
has_trivial_copy_constructor;
has_trivial_assignment_operator;
has_trivial_destructor;
is_POD_type;

数据挖掘实战-基于情感分析+网络语义分析+LDA主题分析对大唐不夜城用户评论进行文本分析 本研究基于去哪儿网和携程网的1888条大唐不夜城游客评论数据,运用Python进行文本分析。通过情感分析发现游客评价以积极为主(占比约70%),中性占20%,消极占10%。采用ROSTCM6软件进行社会网络语义分析,识别不同情绪下的高频词汇。使用LDA主题模型将评论划分为3个主题(夜景、表演、美食),并分析主题强度随时间变化趋势。实验包含数据采集、预处理、情感分析、语义网络分析和LDA建模等完整流程,为景区管理优化提供数据支持。源代码涵盖爬虫、数据处理和可视化分析的全套实现。 阅读详情

相关推荐

Unity3d SECTR 2019 从零开始了解(零)

插件刚下载下来,虽然从Demo里面看了下大致效果,但尝试使用的时候茫无头绪,因此决定一边读文档一边写下笔记。这个笔记会从最基本的名词概述开始一步一步到用法。 除非特别注明,所有内容都不是机翻,而是理解后自己翻译的。 翻译内容: 【零】API REFERENCE MANUAL第一章Documentation Core Concept 【一】 名词概述 CORE CORE是SECTR的核心,一个快速将 Sectors 和 Portals 加入到Unity中的工具,以及完整的源代码,可以构筑独特的功能。 VI

狗蛋在土里瑟瑟发抖 1501

STL源码剖析笔记——迭代器

STL源码剖析笔记——迭代器

weixin_48956191的博客 1199

从零配置Archery:手把手教你用Docker部署多数据库审核系统(MySQL/PostgreSQL/ClickHouse)

本文详细介绍了如何从零开始使用Docker部署Archery多数据库审核系统,涵盖MySQL、PostgreSQL和ClickHouse的配置与整合。文章提供了生产级Docker-compose配置、审核规则定制、工单流程设置以及企业微信通知集成等实战指南,帮助团队构建统一的企业级SQL审计平台,提升数据库操作规范与安全。

e4f5g6h7的博客 941

1.STL源码解析-迭代器Iterator

设计迭代器的时候,需要设计适当的相应型别以及对应的符号重载。而设计适当的迭代器,则是容器的责任。只有容器才知道该设计出怎样的迭代器来遍历自己,并执行迭代器该有的各种行为(前进、后退、取值、取用成员等)。而算法,完全是独立于容器和迭代器之外的,可以自由设计,在设计时以迭代器为对外接口就行了。traits技法广泛用于STL中,它利用“内嵌型别”的编程技巧,与编译器的模板templete参数推导功能,来为C++提供型别识别的能力。

weixin_44477424的博客 1266

Android投屏开发实战:手把手教你用Miracast实现Sink端功能(附完整代码)

本文是一份Android投屏Sink端开发的实战指南,详细讲解了如何利用Miracast协议和Wi-Fi P2P技术,从零构建一个功能完整的屏幕接收器。内容涵盖环境搭建、通过反射启用WFD Sink模式、RTSP协议协商、RTP流接收与解析,以及最终使用IjkPlayer进行音视频解码播放的全过程,并附有核心代码示例。

cherry的博客 878

大模型训练和推理

大模型训练moe是指混合专家(Mixture-of-experts,简称MoE)的,这是一种用于提高大型神经网络性能的技术,它可以将模型的一部分替换为多个专家,每个专家只负责处理一部分输入数据,从而增加模型的参数量和表达能力,同时减少计算量和训练时间。指令可以作为模型的输入的一部分,也可以作为模型的输出的一部分,具体取决于任务的类型。上下文扩展技术的,这是一种用于提高大型语言模型(LLM)对长文本的处理能力的技术,它可以让模型在不增加参数量的情况下,扩展其注意力范围,从而提高模型的语言理解和生成能力。

weixin_45325331的博客 6022

STL源码剖析阅读——迭代器Iterators

STL源码剖析阅读之迭代器

m0_43424329的博客 805

基于MATLAB自动发电控制(AGC)仿真系统的设计与实现:电力系统频率稳定与功率平衡的深入解析

自动发电控制(AGC)是电力系统运行中的一个关键功能,其主要任务是通过自动调节发电机组的输出功率,使得电网中的频率稳定在规定范围内,并维持发电与负荷的动态平衡。当电力负荷发生变化时,AGC会立即响应,调整发电机的功率输出,以避免电网频率的剧烈波动。维持系统频率稳定:电网频率通常应维持在标准值(例如50Hz或60Hz)附近。当负荷波动或电力需求突然变化时,AGC通过调节发电机输出,确保频率不发生过大的偏离。实现区域内的功率平衡。

qq_38334677的博客 1111

STL迭代器详解

文章目录1. 迭代器(iterator)是一种智能指针(smart pointer)2. 迭代器相应类型(associate types) 不同于OOP(Object Oriented Programming)将数据(datas)和行为(methods)组织在一起的思想,STL的中心思想GP(Generic Programming)在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后再以胶着剂将它们撮合在一起。那么之间的胶着剂就是迭代器(iterator)。

To the beyond and infinity! 2779

Unity大世界流式加载:工业级架构与优化秘籍

游戏大厂Unity大世界流式加载框架全景解析:从《原神》《和平精英》等标杆案例出发,深入剖析工业级流式加载的完整技术架构。文章系统介绍了大世界分区块管理、异步加载机制、资源优化策略、多平台适配方案,以及业务联动与团队协作流程。重点阐述了Addressable与AssetBundle应用、空间触发器设计、性能自适应等核心技术,并展望AI预测加载、云游戏等未来方向。全面展现了大厂如何通过流式加载技术实现无缝开放世界体验的技术路径与实践经验。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 607

EndNote导入文献出现带有大括号{}乱码的解决办法

进入word中的Endnote工具栏——Bibliography Preferences(位于Bibliography区块的右下角),就是那个输入杂志名的小三角形,在Temporary citation delimiters处修改变量的默认符号。将默认的大括号{}修改为文章中不回使用到的符号。原因:因为Endnote插入的参考文献在Word中的代码就是以大括号隔开的,当文章中出现了该符号,endnote就会自动比对Library中的书目,而此时endnote出现错误。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 4万+

STL源码剖析 笔记之三 迭代器

第三章 迭代器概念与traits编程技法 《Design Patterns》中提供有23个设计模式的完整描述。 迭代器模式定义如下,提供一种方法,使之能够依序巡防某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式。 迭代器是一种Smart Pointer,迭代器是一种行为类似指针的对象,而指针的各种行为中最重要也是最常见的就是dereference和member a

566

UE5 Niagara基础知识讲解

在UE5版本中,Niagara粒子系统引入了许多可添加的模块,分别用于控制发射器的生成和更新、粒子的生成和更新以及渲染效果。本文采用虚幻5.2.1版本,以图文方式对Niagara基础知识进行讲解。

一碗清深的博客 2470

STL源码剖析笔记二迭代器

二、迭代器 2.1C++模板      模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。   模板是一种对类型进行参数化的工具;通常有两种形式:函数模板和类模板;函数模板针对仅参数类型不同的函数;类模板针对仅数据成员和成员函数类型不同的类。 注意:模板的声明或定义只能在全局,命名空间或

ZWY18064117182的专栏 649

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

阅读STL源码剖析笔记 —— 迭代器概念

摘自侯捷老师的STL源码剖析:一些概念和自己理解的东西: 1.iterator pattern :提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式。 2.STL的中心思想:将数据容器(数据结构) 和 算法 分开,彼此独立设计,最后再以一种粘合剂将它们绑在一起。 3.iterator是一种smart pointer:迭代器是

nia305的博客 660

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

《STL源码剖析》学习笔记之一 迭代器

1.        迭代器迭代器是算法(业务逻辑)和容器之间的黏合剂。迭代器关键是重载operator*和operator->,前者可以作为左值,后者返回指针;前者的语意是取得迭代器指向的对象,后者的语意是取得迭代器指向对象的地址。单向链表,重载operator++()和operator++(int),前者可以作为左值,后者不能作为左值。1.1.       function te

shefg_great的专栏 842

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STL源码剖析读书笔记 迭代器概念traits编程技法

迭代器的设计思维--STL设计理念 STL在设计的时候希望达到将数据结构和算法分离开来独立设计,最后再使用一点耦合剂来使它们联系起来。 这里举了一个容器、算法、迭代器的例子,就是find函数,对于不同类型的迭代器,都可以讲其中的数据与value进行对比,其实表面上看上去迭代器是依附于容器的,那么迭代器是如何设计的呢?它的本质又是什么? template <class InputIte...

weixin_42427338的博客 226

《STL源码剖析》学习笔记4——迭代器(Iterator)

标签:STL,源码,iterator,迭代器,traits,容器,算法,Container,Algorithm   STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,彼此独立设计,最后再用迭代器(Iterator)把他们粘合在一起。可见迭代器在STL中的重要程度。迭代器已经作为一种设计思想被记录与《设计模式》中,它的意图在于“提供一种方法顺序访问一个聚

LonelyWinter的专栏 4043

《STL源码剖析》笔记-迭代器iterators

上一篇:《STL源码剖析》笔记-空间配置器

WizardtoH 620

《STL源码剖析》学习笔记-第3章 迭代器

1、迭代器设计思维-STL关键所在迭代器:就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素。STL的中心思想在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后再以一帖粘合剂将它们撮合在一起。只要对算法给予不同的迭代器,就可以对不同容器进行相同的操作。以算法find( )为例,它接受2个迭代器和1个”搜寻目标”:/

爱橙子的OK绷的专栏 650

stl源码剖析迭代器学习笔记

在关于匹配指针操作的时候,使用了函数的类型推断的机制,这个机制最开始是为了函数重载,但是实际上这里也是为了函数重载,只不过对于不同的指针有不同的操作而进行选择,因为我们实际上是没有区分的类型的,他主动设计了一些类型,然后利用这些类型去调相应的指针操作,比如说对于连续的存储空间,比如说vector它的指针操作就是可以随机加n,但是对于其他的,比如说对于可能就是它只能双向的移动,而且只能一个一个的移动。关于迭代器,迭代器本质上也是一个模板它是模板类,我们可以根据对应的参数类型来去匹配相应的容器。

m0_57222081的博客 156

STL 源码剖析读书笔记二:迭代器与traits

迭代器概述与 traits 编程技法

不积跬步,无以至千里 1074

STL源码剖析阅读笔记二(迭代器)

前言

qw225967的博客 228

stl源码剖析_《STL源码剖析》学习笔记——迭代器与traits编程(一)

迭代器概述Iterator是一种抽象的设计概念《Design Patterns》其中对于iterator模式定义如下:提供一种方法,使之能够依序巡访某个聚合物(容器)所包含的各个元素,而又无需暴露该聚合物的内部表达方式。STL的中心思想在于:将数据容器(containers)和算法(algorithms)分开彼此独立设计,最后再以一贴粘合剂将其撮合。这个粘合剂就是Iterator。迭代器是一种类似...

weixin_39929138的博客 79

STL源码剖析读书笔记 第3章 迭代器概念与traits编程技法

第3章 迭代器概念与traits编程技法 3.1 迭代器设计思维 —STL关键所在 3.2 迭代器是一种smart pointer 迭代器是一种行为类似指针的对象 3.4 Traits编程技法 - STL源码门钥 迭代器所指的物件的型别,称为该迭代器的value type。 所谓value type 是指迭代器所指对象的型别。 型别2:difference type ,用来表示两个迭代器之间...

weixin_41217899的博客 235

《STL 源码剖析》读书笔记 1: 迭代器 iterator

这是我在学习《STL 源码剖析》时, 依据自己的理解记录的笔记. 仅仅是个人理解, 看到这个博客的读者, 如果发现其中存在的问题, 希望可以指出. 我当尽快修改纠正.标签: c++, STL 源码剖析, 读书笔记。

qq_38193114的博客 144
上一篇: 模板类 的完美转发
下一篇: 字典(汇编指令 & INT 21H)
Ink_cherry
博客等级 码龄10年 37粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值