STL组件之——迭代器

STL---迭代器 阅读详情

迭代器

迭代器是一个”可遍历STL容器内全部或部分元素“,一个迭代器用来指出容器中的一个特定位置。

  • operator *     返回当前位置上的元素值。如果该元素拥有成员,你可以通过迭代器直接使用operator->取用它们;
  • operator++   将迭代器前进至下一元素,大多数迭代器还可使用operator--退回到前一个元素;
  • operator==和operator!=    判断两个迭代器是否指向同一位置;
  • operator=    为迭代器赋值;

所有容器类别都提供一些成员函数,使我们得以获得迭代器并以之访问所有元素,其中最重要的两个函数是

begin()返回一个迭代器,指向容器起始点,也就是第一元素的位置;

end() 返回一个迭代器,指向容器最后一个元素的下一个位置;

下面这个例子展示了迭代器的用法:

#include<iostream>
#include<list>

using namespace std;
int main()
{
        list<char> col;
        for(char c='a';c<='z';c++)
        {
                col.push_back(c);
        }
        list<char>::const_iterator it;
        for(it=col.begin();it!=col.end();++it)
        {
                cout<<*it<<" ";
        }
        cout<<endl;
}

 迭代器有两种类型

一种是container::iterator    以”读/写“模式遍历元素

一种是container::const_iterator  以”只读“模式遍历元素

当然我们也可以使用非常量迭代器,这时迭代器是非常量类型的、元素类型也是非常量类型的,我们就可以对容器中的元素进行修改

这里我们将上一个程序的输出全部变为大写

#include<iostream>
#include<list>

using namespace std;
int main()
{
        list<char> col;
        for(char c='a';c<='z';c++)
        {
                col.push_back(c);
        }
        list<char>::iterator it;
        for(it=col.begin();it!=col.end();++it)
        {
                cout<<char(toupper(*it))<<" ";
        }
        cout<<endl;
}

这里就是输出结果,使用了非常量迭代器在输出前对每一个元素进行操作,

迭代器分类及能力
迭代器类型能力供应者
Input迭代器向前读取(read)istream
Output迭代器向前写入(write)ostream,inserter
Forward迭代器向前读取和写入
Bidirectional迭代器向前和向后读取和写入list,set,multiset,map,multimap
Random access迭代器随机存取,可读取也可写入vector,deque,string,array
  • Input(输入)迭代器

        Input迭代器只能一次一个向前读取元素 ,按此顺序一个个传回元素值,下表列出了Input迭代器的各种操作行为

Input迭代器的各项操作
表达式效果        
*iter        读取实际元素
it->member读取实际元素的成员
++iter向前步进(传回新位置)
iter++向前步进(传回旧位置)
iter1==iter2判断两个迭代器是否相等
iter1!=iter2判断两个迭代器是否不相等
TYPE(iter)复制迭代器

应该尽可能地优先使用前置递增运算符(++iter),因为它不需要传回旧值,所以不需要新建一个临时对象来保存旧值

  • Output(输出)迭代器

        Output迭代器和Input迭代器相反,其作用是将元素值一个个写入。也就是说,只能一个元素一个元素地赋值,下表列出Output迭代器的有效操作

Output迭代器的操作
表达式效果
*iter=value将数值写入到迭代器所指位置
++iter向前步进(传回新位置)
iter++向前步进(传回旧位置)
TYPE(iter)复制迭代器
  • Forward(前向)迭代器

        Forward迭代器是Input迭代器和Output迭代器的结合,具有Input迭代器全部功能和Output迭代器的大部分功能,下表是Forward迭代器的所有操作

Forward迭代器的各项操作
表达式效果
*iter存取实际元素
iter->member存取实际元素的成员
++iter向前步进(返回新位置)
iter++向前步进(返回旧位置)
iter1==iter2判断两个迭代器是否相等
iter1!=iter2判断两个迭代器是否不想等
TYPE()产生迭代器(default构造函数)
TYPE(iter)复制迭代器(copy构造函数)
iter1=iter2赋值
  • Bidirectional(双向)迭代器

        在Forward迭代器的基础上增加了反向遍历的能力

Bidirectional迭代器的操作
支持Forward迭代器的所有操作
--iter步退(返回新位置)
iter--步退(返回旧位置)
  • Random Access(随机存取迭代器)

        Random Access迭代器在Bidirectional迭代器的基础上再增加随机存取能力。因此它必须提供“迭代器算术运算”,也就是说它能加减某个偏移量、能处理距离问题,并运用关系运算符进行比较

Random Access迭代器的操作
支持Bidirectional迭代器的所有操作
iter[n]存取索引位置为n的元素
iter+=n向前跳n个元素(n<0,就向后跳)
iter-=n向后跳n个元素(n<0,就向前跳)
iter+n传回iter之后的第n个元素
n+iter传回iter之后的第n个元素
iter-n传回iter之前的第n个元素
iter1-iter2传回iter1和iter2之间的距离
iter1<iter2判断iter1与iter2的前后关系
iter1>iter2判断iter1与iter2的前后关系
iter1<=iter2判断iter1与iter2的前后关系
iter1>=iter2判断iter1与iter2的前后关系

 用以下程序说明该迭代器的特殊能力

#include<vector>
#include<iostream>
using namespace std;
int main()
{
	vector<int> col;
	//insert slements from -3 to 9
	for (int i = -3; i <= 9; ++i)
	{
		col.push_back(i);
	}

	cout << "numbers distance: " << col.end() - col.begin() << endl;

	//print all elements  use < instead of !=
	vector<int>::iterator it;
	for (it = col.begin(); it <col.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;

	//print all elements use operator []
	for (int i = 0; i < col.size(); ++i)
	{
		cout << col.begin()[i] << " ";
	}
	cout << endl;

	//print odd position elements use operator+=
	for (it = col.begin(); it < col.end()-1; it += 2)
	{
		cout << *it << " ";
	}



}

 注意程序的最后一个循环,it<col.end()-1;这里要求col至少包含一个元素。如果序列为空,col.end()-1便会位于col.begin()之前;

  • 迭代器相关辅助函数

        C++标准库为迭代器提供了三个辅助函数:advance(),distance()和iter_swap()。前两者提供给所有迭代器一些原本只有Random Access迭代器才有的能力:前进或后退多个元素,及处理迭代器之间的距离,第三个辅助函数允许交换两个迭代器的值。

  • advance()可令迭代器前进

        advance()可将迭代器的位置增加,增加的幅度由参数决定

#include<iterator>
void advance(InputIterator &pos,Dist n)
  • 使名为pos的Input迭代器步进或(步退)n个元素
  • 对Bidirectional迭代器和Random Access迭代器而言,n可为负值,表示向后退
  • Dist 是个template型别。通常应该是个整型
  • advance()并不检查迭代器是否超过序列的end()(因为迭代器通常不知道其操作的容器,因此无从检查)。所以调用advance()有可能导致未定义行为

下面是advance()运用实例

#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
int main()
{
	list<int> col;

	//insert elements from 1 to 9
	for (int i = 1; i <= 9; ++i)
	{
		col.push_back(i);
	}
	list<int>::iterator it = col.begin();

	//print actual element
	cout << *it << endl;
	
	//step 3 elementd forward
	advance(it, 3);

	//print actual element
	cout << *it << endl;

	//step 1 element backward
	advance(it, -1);

	//print actual element
	cout << *it << endl;
}

在这个程序中,advance()使迭代器向前进3个元素,再向后退一个元素。 

  • distance()可处理迭代器之间的距离

         函数distance()用来处理两个迭代器之间的距离

#include<iterator>
Dist distance(InputIterator pos1,InputIterator pos2)
  • 传回两个Input迭代器pos1和pos2之间的距离
  • 两个迭代器都必须指向同一个容器
  • 如果不是Random Access迭代器,则从pos1向前走必须能够到达pos2
  • 返回值Dist的类型由迭代器决定
#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
int main()
{
	list<int> col;
	//insert elements
	for (int i = -3; i <= 9; ++i)
	{
		col.push_back(i);
	}
	cout << " col: ";
	for (auto c : col)
	{
		cout << c << " ";
	}
	cout << endl;
	//search element with value 5
	list<int>::iterator pos;
	pos = find(col.begin(), col.end(), 5);

	if (pos != col.end())
	{
		cout << "difference between beginning and 5: "
			<< distance(col.begin(), pos) << endl;
	}
	else
	{
		cout << "5 not found" << endl;
	}
}

 

find()将数值为5的元素的位置赋给pos。distance()计算出pos和起点位置间的距离

  • iter_swap()可交换两个迭代器所指内容

#include<algorithm>
void iter_swap(ForwardIterator1 pos1,ForwardIterator2 pos2)
  • 交换迭代器pos1和pos2所指的值
  • 迭代器的类型不必相同,但其所指的两个值必须可以相互赋值
#include"algostuff.h"
using namespace std;
int main()
{
	list<int> col;
	//insert elements form 1 to 9
	for (int i = 1; i <= 9; ++i)
	{
		col.push_back(i);
	}
	PRINT_ELEMENTS(col,"col: ");

	//swap first and second value
	iter_swap(col.begin(), ++col.begin());
	PRINT_ELEMENTS(col, "after swap col: ");

	//swap first and last value
	iter_swap(col.begin(), --col.end());
	PRINT_ELEMENTS(col, "after swap col: ");
}

程序中的algostuff.h 

  • 迭代器配接器

这些特殊迭代器使得算法可以以逆向模式(reverse mode)、安插模式(insert mode)进行工作,也可以和流(stream)搭配工作

  • Reverse(逆向)迭代器

        Reverse迭代器是一种配接器,重新定义递增运算和递减运算,使其行为正好倒置。所有标准容器都允许使用Reverse迭代器来遍历元素

#include<iostream>
#include<list>
#include<algorithm>
using namespace std;

void print(int elem)
{
	cout << elem << " ";
}
int main()
{
	list<int> col;
	//insert element form 1 to 9
	for (int i = 1; i <= 9; ++i)
	{
		col.push_back(i);
	}
	//print all elements
	for_each(col.begin(), col.end(), print);
	cout << endl;

	//print all elements in reversed order
	for_each(col.rbegin(), col.rend(), print);
	cout << endl;
}

 

容器的成员函数rbegin()和rend()各传回一个Reverse迭代器,它们就像begin()和end()的返回值一样,共同定义出一个半开区间,不同的是它们以相反的方向操作

rbegin()传回逆向遍历的第一元素位置,也就是实际上最后一个元素的位置;

rend()传回逆向遍历时最后一个元素的下一个位置,也就是实际第一元素的前一个位置;

可以将一般迭代器转换成一个Reverse迭代器,前提是那个迭代器必须具有双向移动能力。注意,转换前后迭代器的逻辑位置发生了变化。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
	vector<int> col;
	//insert element form 1 to 9
	for (int i = 1; i <= 9; ++i)
	{
		col.push_back(i);
	}
	//find position of element with value 5
	vector<int>::iterator pos;
	pos=find(col.begin(), col.end(), 5);
	cout << "pos: " << *pos << endl;

	//convert iterator to reverse iterator rpos
	vector<int>::reverse_iterator rpos(pos);
	//rpos = find(col.rbegin(), col.rend(), 5);
	cout << "rpos: " << *rpos << endl;

}

 

我们首先打印迭代器所指的元素,然后将该迭代器转化成一个Reverse迭代器,再次打印它所指的元素,结果其值竟然变了,从5变成了4。注意这是特性而不是错误!导致这个行为的原因是区间的半开性,为了能够指定容器内的所有元素,必须使用“最后一个元素的下一位置”。而对Reverse迭代器而言,这个位置位于第一元素之前,但是这个位置有可能并不存在,因为容器并不要求其第一元素之前的位置合法。为此,逆向迭代器实际上倒置“半开原则”,逆向迭代器所定义的区间,实际上并不包括起点,反倒是包括了终点,然而逻辑上其行为与正向迭代器相同,这么一来,逆向迭代器实际所指向的元素位置和逻辑上所指的元素位置并不一致。

 下面我们看这一个例子

#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;

void print(int elem)
{
	cout << elem << " ";
}
int main()
{
	deque<int> col;
	//insert element form 1 to 9
	for (int i = 1; i <= 9; ++i)
	{
		col.push_back(i);
	}
	//find position of element with value 2
	deque<int>::iterator pos1;
	pos1=find(col.begin(), col.end(), 2);
	//find position of element with value 7
	deque<int>::iterator pos2;
	pos2 = find(col.begin(), col.end(), 7);

	//print all element in range[pos1,pos2)
	for_each(pos1, pos2, print);
	cout << endl;

	//convert iterator to reverse iterator
	deque<int>::reverse_iterator rpos1(pos1);
	deque<int>::reverse_iterator rpos2(pos2);

	//print all element in range [pos1,pos2) in reverse order
	for_each(rpos2, rpos1, print);
	cout << endl;
	

}

 迭代器pos1和pos2定义一个半开区间,包括2而不包括7。当把这两个迭代器转化成逆向迭代器时,该区间仍有效,而且可以被逆序处理。

当然也可以用base()将逆向迭代器转回正常迭代器

#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
int main()
{
	list<int>col;

	//insert element from 1 to 9
	for (int i = 1; i <= 9; ++i)
	{
		col.push_back(i);
	}

	//find position of value 5
	list<int>::iterator pos;
	pos=find(col.begin(), col.end(), 5);
	cout << "pos: " << *pos << endl;

	//convert iterator to reverse iterator
	list<int>::reverse_iterator rpos(pos);
	//print value at rpos
	cout << "rpos: " << *rpos << endl;

	//convert reverse iterator to normal iterator
	list<int>::iterator rrpos;
	rrpos = rpos.base();
	cout << "rrpos: " << *rrpos << endl;
}

 

  • Insert(安插型)迭代器

Insert迭代器用来将“赋值新值”操作转换为“安插新值”操作。通过这种迭代器,算法可以执行安插操作而非覆盖行为

insert迭代器的种类

C++ 标准器提供三种Insert迭代器,back Insert,front Insert,general Insert。它们之间的区别在于插入位置,事实上它们各自调用所属容器中不同的成员函数,所以Insert迭代器初始化时一定要清楚知道自己所属的容器是哪一种。每一种Insert迭代器都可以由一个对应的便捷函数加以生成和初始化。

Insert迭代器的种类
名称Class其所调用的函数生成函数
back insertback_insert_iteratorpush_back(value)back_insert(cont)
front insertfront_insert_iteratorpush_front(value)front_insert(cont)
general insertinsert_iteratorinsert(pos,value)inserter(cont,pos)

当然容器本身必须支持Insert迭代器所调用的函数,否则该种Insert就不可用。因此back insert 只能用在vector、deque、list、string身上,front insert只能用在deque 和list身上。 

back Insert透过成员函数push_back()将一个元素值追加于容器尾部,它生成时必须根据其所属容器进行初始化。

#include"algostuff.h"
using namespace std;
int main()
{
	vector<int> col;
	back_insert_iterator<vector<int>>iter(col);
	//insert elemnets with the usual iterator interface
	*iter = 1;
	iter++;
	*iter = 2;
	iter++;
	*iter = 3;
	iter++;
	PRINT_ELEMENTS(col, "col: ");

	//create back inserter and insert elements
	back_inserter(col) = 44;
	back_inserter(col) = 55;
	PRINT_ELEMENTS(col, "col: ");

	//use back inserter to append all elements again
	col.reserve(2 * col.size());
	copy(col.begin(), col.end(), back_inserter(col));
	PRINT_ELEMENTS(col, "col: ");

}

 

 front Insert透过成员函数push_front()将一个元素值加在容器头部。由于push_front()只在deque和list中实现,所以也只有这两个容器支持front Insert。

#include"algostuff.h"
using namespace std;
int main()
{
	list<int> col;
	front_insert_iterator<list<int>>iter(col);
	//insert elements with the usual iterator interface
	*iter = 1;
	iter++;
	*iter = 2;
	iter++;
	*iter = 3;
	PRINT_ELEMENTS(col, "col: ");

	//create dront inserter and insert elements
	front_inserter(col) = 44;
	front_inserter(col) = 55;

	PRINT_ELEMENTS(col, "col: ");

	//user front inserter to insert all elements again
	copy(col.begin(), col.end(), front_inserter(col));
	PRINT_ELEMENTS(col, "col: ");


}

 

安插多个元素时,front inserter以逆序方式插入,这是因为它总是将后一个元素插入到前一个元素之前

  • General Inserter

General Inserter根据两个参数初始化:(1)容器(2)待安插位置。迭代器内部以“待安插位置”为参数,调用成员函数insert()。便捷函数inserter()则是提供了更为方便的方式

General Inserter对所有标准容器均适用,因为所有容器都有insert()成员函数。按插完成后general inserter获得刚刚被安插的那个元素的位置。

#include"algostuff.h"
using namespace std;
int main()
{
	set<int> col;
	//create insert iterator for col
	insert_iterator<set<int>>iter(col, col.begin());

	//insert elements with usual iterator interface
	*iter = 1;
	iter++;
	*iter = 2;
	iter++;
	*iter = 3;
	PRINT_ELEMENTS(col, "col: ");

	//create inserter and insert elements
	inserter(col, col.end())=44;
	inserter(col, col.end()) = 55;
	PRINT_ELEMENTS(col, "col: ");

	//use inserter to insert all elements into a list
	list<int>col2;
	copy(col.begin(), col.end(), inserter(col2, col2.begin()));
	PRINT_ELEMENTS(col2, "col2(list): ");

	//use inserter to reinsert all elements into the list before the second element
	copy(col.begin(), col.end(), inserter(col2, ++col2.begin()));
	PRINT_ELEMENTS(col2, "col2: ");

}

 

  • Stream(流)迭代器

Stream迭代器是一种迭代器配接器,通过它可以把stream当作算法的起点和终点

  • ostream迭代器

ostream迭代器可以将被赋予的值写入output stream中,它的实作机制和Insert迭代器概念一样,唯一的区别是ostream迭代器将赋值操作转化为operator<<。如此一来算法就可以使用一般的迭代器接口直接对stream执行动作。

ostream迭代器的各项操作
ostream_iterator<T>(ostream)为ostream产生一个ostream迭代器
ostream_iterator<T>(ostream,delim)为ostream产生一个ostream迭代器,各元素之间以delim为分隔符(delim的类型为const char*)
*iter无实际操作(传回iter)
iter=value将value写到ostream
++iter无实际操作(传回iter)
iter++无实际操作(传回iter)

产生ostream迭代器时,必须提供一个output stream作为参数,迭代器将会把元素值写到该output stream身上,另外一个作为分隔符的参数可有可无 

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;
int main()
{
	//create ostream iterator for stream cout
	ostream_iterator<int> intWriter(cout, "\n");

	//write elements with th uaual iterator interface
	*intWriter = 42;
	intWriter++;
	*intWriter = 77;
	intWriter++;
	*intWriter = -5;

	//create collection with elements from 1 to 9
	vector<int>col;
	for (int i = 1; i <= 9; ++i)
	{
		col.push_back(i);
	}

	//write all elements without any delimiter
	copy(col.begin(), col.end(), ostream_iterator<int>(cout));
	cout << endl;

	//write all elements with "<" as delimiter
	copy(col.begin(), col.end(), ostream_iterator<int>(cout, " < "));
	cout << endl;

}

 

分隔符的类型是const char*,如果传递一个string对象进去,需调用c_str()成员函数获得正确类型

	string delim;
	ostream_iterator<int>(cout, delim.c_str());

C++,STL 六大组件:容器、迭代器、算法、函数对象、适配器、分配器 C++ 标准模板库(Standard Template Library, STL)是泛型编程的典范,其核心思想是通过高度抽象的组件实现数据结构和算法的解耦。STL 的成功离不开其六大核心组件的协同工作:容器(Containers)、迭代器(Iterators)、算法(Algorithms)、函数对象(Functors)、适配器(Adapters)和分配器(Allocators)。这些组件各司其职,共同构建了一个高效、灵活且通用的编程框架。本文将深入解析这六大组件的功能、用法及其相互关系。 阅读详情

相关推荐

手把手教你搭建三端口DC-DC变换器(含Boost+Buck电路实战)

本文详细介绍了如何从零开始搭建三端口DC-DC变换器,涵盖Boost和Buck电路的硬件设计、元器件选型、电路板布局、焊接技巧、控制系统设计与调试等关键步骤。通过实战案例和优化建议,帮助工程师避开常见陷阱,提升系统效率和稳定性,适用于光伏、储能等电力电子应用场景。

x8y9z0的博客 931

STL迭代器

目录 一、迭代器 基本概念 (1)内置迭代器的使用 (2)自己模拟迭代器的实现 (3)流型迭代器 二、lambda表达式 (1)基本概念 (2)捕获方式的区别 三、仿函数 包含头文件functional 基本概念 使用 四、函数适配器 包含头文件functional (1)普通函数绑定 (2)类内成员函数绑定 (3)占位符表示原来的参数去第几位 五、函数包装器 包含头文件functional (1)包装普通函数 (2)包装成员函数和静态函数 (3)包装仿函数 ...

weixin_61438881的博客 3334

Ubuntu 24.04.3 LTS 安装 OpenClaw 图文版

OpenClow安装指南

qq_17204557的博客 2552

STL六大组件之迭代器(Iterator)

在STL的设计理念中,将存储数据的类型(容器)和操作容器的动作(算法)二者彼此独立开来,这就导致我们无法直接通过算法来去操作存储在容器中的数据,而Iteratror的设计,就是为了提供一种统一的访问容器中元素的方式,无论容器的内部结构如何,通过迭代器,我们的算法就能够去操作相应的数据。以标准库find()为例,我们只需要告诉find查找元素的起始位置和终点位置,以及一个目标值,而不需要告诉它容器的类型,它就可以帮我们在该范围内找是否有目标值。

qq_57198230的博客 853

智能优化电池:基于单片机的电池管理系统

设计简介: 本设计是基于单片机的电池管理系统,主要实现以下功能: 可通过LCD1602显示温度、电压电流值; 可通过按键调整温度、电压和电流的阈值; 用ADC0832将模拟量转换为数字量。 标签:51单片机、LCD1602、ADC0832 效果图: 总体资料: 原理图: 软件设计流程: 系统框图: 本设计以STC89C52单片机为核心控制器,加上其他的模块一起组成电动汽车的电池管理的整个系统,...

专注单片机实战教学,分享单片机学习资料 375

【PLC】三菱PLC控件安装疑难解析:Error Number:-119的全面解决方案

本文针对三菱PLC控件安装过程中常见的Error Number:-119错误,提供了深度解析与实战解决方案。该错误通常源于Windows系统权限限制或文件冲突。文章从理解错误本质入手,逐步介绍了以管理员身份运行、手动注册DLL文件、采用新版环境搭配旧版控件的黄金组合以及系统环境修复等四大招法,帮助用户彻底解决这一安装难题,确保工控软件稳定运行。

jj890的博客 496

C++STL之迭代器(iterator)详解

答:迭代器是一种检查容器内元素并且遍历容器内元素的数据类型。😧(看不懂,没关系,c语言学过吧,指针知道吧,没错,这就和访问数组的指针类似,指针是C语言里面就有的东西,而迭代器是C++里面才有的,二者还有其他区别,之后再整理😁)

weixin_74334323的博客 7239

PDPS16.0单机版与SPLMLicenseServer授权避坑指南:从安装到冲突解决

本文详细解析了PDPS16.0单机版的安装与授权流程,重点阐述了如何正确配置SPLMLicenseServer本地许可证服务器以实现软件激活。针对安装过程中常见的许可证冲突问题,提供了清晰的排查思路和解决方案,并介绍了通过设置环境变量等替代授权方法,帮助用户高效避坑,确保Tecnomatix Process Simulate顺利运行。

weixin_29231221的博客 565

STL之迭代器(iterator)

迭代器(iterator)模式又称为游标(Cursor)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这样说可能更容易理解:Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。

weixin_44664985的博客 1306

二、租用AutoDL服务器与连接教程

点击右上角控制台,选择【租用新的实例】;,我这里使用的是xshell和xftp工具(自行下载)。打开本地目录和服务器目录,直接拖动文件。

zzf021122的博客 1329

C# 零基础入门知识点汇总

本文属于C#零基础入门之百识百例系列目录文章。此系列文章已经完结,欢迎大家点击文中文章链接查看详情进行学习。

陈言必行 -- Unity游戏开发领域优质博主 5351

【C++ 十】STL基本概念、STL六大组件、STL容器、STL算法、STL迭代器

本文包含 STL 的诞生、STL 基本概念、STL 六大组件、STL 容器、STL 算法、STL 迭代器、vector 存放内置数据类型、vector 存放自定义数据类型、vector 容器嵌套容器。

qq_45138120的博客 1112

【3GPP核心网】【5G】史上最全的5G协议规范总结

物理层信道定义:TS38.211(物理层信号的生成、调制,DMRS和额外DMRS,PRACH configuration index,Point A等介绍)传输信道和控制信道的数据处理:TS38.212(包括复用,信道编码,交织,DCI,DMRS端口号等)物理层控制过程:TS38.213(同步,上行功控,随机接入,UE上报和接收控制消息的过程,SSB等)物理层测量:TS38.215(UE和网络的测量控制,UE测量能力)频率、频点相关F R1:TS38.101-1。

风云说通信 3178

STL之三大组件:容器、算法、迭代器

STL(Standard Template Library,标准模板库) STL从广义上分为:容器(container) 算法(algorithm) 迭代器(iterator) 容器和算法之间通过迭代器进行无缝连接 STL六大组件: 容器:各种数据结构,如vector、list、deque、set、map等 算法:如sort、find、copy、for_each 迭代器:扮演了容器与算法之间的胶合...

weixin_44060964的博客 790

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++ STL基本组件:容器,算法,迭代器

STL,是Standard Template Library的缩写,标准模版库。 STL使用类模版或者函数模版实现,包含3个最基本最重要的组件: 容器:使用类模版实现的各种数据结构 算法:使用函数模版实现的各种算法 迭代器:类模版,每个容器类都有自定义的迭代器类 使用容器对象的相关方法,可以获取迭代器对象 算法函数的参数和返回值,很多是迭代器对象 STL容器包含2种: 序列式容器:容器中的元素是无序的,可以指定元素的位置,比如vector、list、deque 关联式容器:容器中的元素是键值对(

583

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

STL诞生,STL基本概念,STL六大组件,STL容器、算法、迭代器

STL诞生 长久以来,软件界希望建立一种可重复利用的东西 C++的面向对象和泛型编程思想就是为了提升复用性 为了建立数据结构和算法的标准,诞生了STL STL基本概念 STL(Standard Template Library)标准模板库 从广义上分为容器(container),算法(algorithm),迭代器(iterator) 容器和算法之间通过迭代器进行无缝连接 STL几乎所有代码都采用了模板类或模板函数 STL六大组件 六大组件:容器、算法、迭代器、仿函数、适配器(配接器)、空

shy的博客 624

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【STL一】STL组件(容器、迭代器、算法、适配器、函数对象、内存分配器)

STL,英文全称 standard template library,中文可译为标准模板库(或者泛型(generic)库),其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合

junxuezheng的博客 895

C++ STL全面解析:六大核心组件之一----迭代器(STL进阶学习)

C++标准模板库(STL)是一组高效的数据结构和算法的集合,广泛应用于C++程序设计中。

LKHzzzzz的博客 1263

【C++ STL简介】从六大组件到容器、迭代器与算法协作

STL 是的缩写,通常译为“标准模板库”。它不是某一个类,也不是几个容器的集合,而是一套建立在泛型编程思想上的可复用组件体系。可以先记住一句话:STL 用模板把常见数据结构和算法抽象成通用组件,让同一套算法可以服务于多种容器与元素类型。例如,排序不应该为intdouble、自定义类型分别复制一份代码;查找也不应该为数组、vectorlist分别重新发明。STL 尝试把变化的类型与存储方式隔离出去,把稳定的算法保留下来。是保存数据的容器;begin()和end()返回迭代器,共同描述待处理区间。

星光编译者的技术博客,专注 C/C++、Linux、数据结构与算法。 464

【c++】STL 核心组件解析:容器、算法与迭代器

深入剖析底层实现原理,包括核心数据结构设计、内存分配机制、扩容策略等关键技术细节。不仅要掌握API的使用方法,更要理解容器类库的架构思想和实现逻辑,达到知其然更知其所以然的深度。

m0_53441395的博客 1158

STL(标准模板库)六大组件、容器迭代器以及常用容器

连续开辟,单向开口,随机访问迭代器,数据结构:数组for(;it!=v.end();it++){//操作 *it取值单向开口、没有迭代器双向开口,没有迭代器双向开口的连续线性空间,分段连续空间组合而成离散存储、双向迭代器、元素可重复,vector单端动态数组 随机访问迭代器重点比如软件历史操作记录的存储,我们经常要查看历史记录,比如上一次的记录,上上次的记录,但却不会去删除记录,因为记录是事实的描述。数据结构数组deque:双端动态数组 随机访问迭代器deque。

weixin_66635580的博客 1273

STL 的 “组件化思想”:泛型编程中容器、算法、迭代器的解耦逻辑

当算法作用于迭代器时,满足: $$ \forall c \in \text{Container}, \exists I_c \text{ s.t. } \text{Algorithm}(I_c) \equiv \text{Process}(c) $$ 这种泛化使时间复杂度从$O(n^2)$(传统硬编码方案)降至$O(1)$(组件配置时间)。这种强化使接口错误从运行期转移到编译期,符合: $$ \text{ErrorCost} \propto \frac{1}{\text{CompilePhase}} $$

qq_26751839的博客 760

C++ STL 组件 —— 迭代器

包含 forward_iterator_tag、bidirectional_iterator_tag、 random_access_iterator_tag类型;类型的对象来访问容器(如下例1、2);另外C++标准库算法(Algorithm)等都需要借助迭代器访问容器(如下例3)。目前对迭代器的基本特点有一个认识,后续通过实现容器对迭代器进行深入了解。类型应保证足以存放同一数组中两个指针之间的差距, 有可能是负数;C++ 容器类都定义了名为。

ypy9323的博客 669

STL六大组件之——迭代器这个东西

STL六大组件之——迭代器这个东西 迭代器:除了在其它语言中司空见惯的下标法访问容器元素之外,C++语言提供了一种全新的方法——迭代器(iterator)来访问容器的元素。迭代器其实类似于引用,指向容器中某一元素。换个方式来说,容器就是数据结构的泛指,迭代器就是指针的泛指,可以指向元素。容器相当于一个储藏柜,里面装的许多不同的物品就像是储存的元...

weixin_30662849的博客 139

1.2 STL核心组件:容器、迭代器与算法详解

容器(如vector)负责把数据元素组织起来。迭代器(如)作为容器的内部指针,提供了访问数据的统一接口。算法(如sort)通过迭代器从容器中获取数据,进行处理,再将结果通过迭代器写回容器。这种设计实现了数据结构和算法的分离。你写一个sort算法,它既可以对int数组排序,也可以对string链表排序,只要它们提供的迭代器满足要求。

weixin_73064319的博客 685

浅析STL三大组件,容器 算法 迭代器。

迭代器是容器与算法之间的胶合剂,所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。所以说,我们想遍历某一个容器,就必须使用这个容器的迭代器才可以。...

qq_51004011的博客 1216
上一篇: STL组件之——容器
下一篇: 利用OpenCV把一幅彩色图像转换成灰度图
yangSHU21
博客等级 码龄4年 303粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值