迭代器 形式概述

迭代器萃取和反向迭代器 迭代器是什么 迭代器是一种行为类似指针的对象,通过重载一些操作指针的如++,--,*,->,可以不知道容器的结构来访问容器。 为什么每一种容器都提供有专属的迭代器 要设计出一个容器的迭代器就必须对这个容器实现的细节非常的了解,既然无法避免曝光容器的细节,那么就把这个工作交给这个容器的设计者,这样一来,容器的所有细节得到了封装,不被使用者看到。 第一为了保持数据结构的 阅读详情
InputIterator:一个只允许单个向序列读入元素的输入迭代器,前向传递使用operator++和operator*。也可以通过operator==和operator!=检测输入迭代器。 OutputIterator:一个只允许单个向序列写入元素的输出迭代器,前向传递使用operator++和operator*。不可以通过 operator==和operator!=检测输出迭代器。OutputIterator可以与ostream一起使用,同时也普遍使用“插入”迭代器 back_inserter()。 ForwardIterator:仅用operator++前向移动,但是可以同时进行读和写,并且可以在相通的范围内比较这些迭代器是否相等。 BidirectionalIterator:一个可以后向移动的ForwardIterator,另外还增加了operator--运算。 RandomAccessIterator:支持一个常规指针所做的全部运算:可以通过增加和减少某个整数值,来向前和向后跳跃移动,还可以用operator[]作为下标索引,可以从一个迭代器中减去另一个迭代器,也可以用operator<和operator>来比较迭代器看哪个更大等。 填充和生成: fill()对[first,last)范围内的每个元素赋值value,fill_n()对由first开始的n个元素赋值value。 void fill(ForwardIterator first, ForwardIterator last, const T& value); void fill_n(OutputIterator first, Size n, const T& value); generate()为[first,last)范围内的每个元素进行一个gen()调用,可以假定为每个元素产生一个不同的值。 generate_n()对gen()调用n次,并且将返回值赋给由first开始的n个元素。 void generate(ForwardIterator first, ForwardIterator last, Generator gen); void generate_n(OutputIterator first, Size n, Generator gen); 计数: 所有的容器都含有一个成员函数size(),它可以告之该容器包含有多少个元素。size()的返回类型是迭代器的difference_type(通常是ptrdiff_t)。 count()算法中产生[first,last)范围内其值等于value(当用operator==测试时)的元素的个数。 count_if()算法产生[first,last)范围内能使pred返回true的元素的个数。 IntegralValue count(InputIterator first, InputIterator last, const EqualityComparable& value); IntegralValue count_if(InputIterator first, InputIterator last, Predicate pred); 操作序列: copy()算法从范围[first,last)复制序列到destination,每次赋值后都增加destination,由于使用了赋值操作,因此不能直接向空容器或容器末尾插入元素,而必须把destination迭代器封装在insert_iterator里(典型地使用 back_inserter()或inserter())。 OutputIterator copy(InputIterator first, InputIterator last, OutputIterator destination); copy_backward()算法以相反的顺序复制元素,第1个目的元素是destinationEnd - 1,并且每次赋值后都减少destinationEnd。目的序列范围的空间必须已经存在。 BidirectionalIterator2 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, BidirectionalIterator2 destinationEnd); reverse()倒置原序列范围的元素。 reverse_copy()保持原序列范围元素顺序不变,而将倒置的元素复制到destination,返回结果序列范围的超越末尾的迭代器。 void reverse(BidirectionalIterator first, BidirectionalIterator last); OutputIterator reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator destination); swap_ranges()通过交换对应的元素来交换相等大小的两个范围的内容 ForwardIterator2 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2); 轮换函数: rotate()把[first,middle)范围中的内容移动到该序列的末尾,并且将[middle,last)范围中的内容移到序列的开始位置。 rotate_copy()不改变原始序列范围,且将轮换后版本的元素复制到destination,返回结束范围的超越末尾的迭代器。 void rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last); OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator destination); 后继和前驱排列函数: 如果没有多个后继排列,元素以升序排列,next_permutation()返回false。 如果没有多个前驱排列,元素以降序排列,prev_permutation()返回false。 bool next_permutation(BidirectionalIterator first, BidirectionalIterator last); bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, StrictWeakOrdering binary_pred); bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last); bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last, StrictWeakOrdering binary_pred); random_shuffle()随机地重排范围内的元素。 void random_shuffle(RandomAccessIterator first, RandomAccessIterator last); //使用内部随机数发生器 void random_shuffle(RandomAccessIterator first, RandomAccessIterator last RandomNumberGenerator& rand); //使用用户提供的随机数发生器 调用partition()后,每个结果子序列的元素顺序并没有被指定。 调用stable_partition()后,划分点前后这些元素的相对顺序与划分处理前相同。 BidirectionalIterator partition(BidirectionalIterator first, BidirectionalIterator last, Predicate pred); BidirectionalIterator stable_partition(BidirectionalIterator first, BidirectionalIterator last, Predicate pred); 查找和替换: find()在某个范围内的序列元素中查找value。返回一个迭代器,该迭代器指向在范围[first,last)内value第1次出现的位置,如果value不在范围内,find()返回last。这是线性查找。 InputIterator find(InputIterator first, InputIterator last, const EqualityComparable& value); find_if()在指定的序列范围内执行线性查找。然而,代替查找value,find_if()寻找一个满足pred的元素,当查找到这样的元素时Predicate pred返回true。如果不能找到这样的元素则返回last。 InputIterator find_if(InputIterator first, InputIterator last, Predicate pred); adjacent_find()在指定的序列范围内执行线性查找两个邻近的相等元素。 形式一查找两个相等的元素(通过operator==)。 形式二查找两个邻近的元素,当找到这两个元素并一起传递给binary_pred时,产生true结果。如果找到这样的一对元素,则返回指向两个元素中第1个元素的迭代器,否则返回last。 ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last); ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred); find_first_of()在第2个范围内查找与第1个范围内的某个元素相等的元素。 形式一使用operator==。 形式二使用提供的判定函数。 ForwardIterator1 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2); ForwardIterator1 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, binaryPredicate binary_pred); search()检查第2个序列范围是否出现在第1个序列的范围内(顺序也完全一致),如果是则返回一个迭代器,该迭代器指向在第1个范围序列中第2个范围序列出现的开始位置。如果没有找到就返回last1。 形式一使用operator==。 形式二检测被比较的每对元素是否能使binary_pred返回true。 ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2); ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate binary_pred); find_end()查找第2个范围的序列是否在第1个范围内作为子集出现,查找该子集最后出现的位置,并且返回指向该子集的第一个元素的迭代器。 ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2); ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate binary_pred); search_n(): 形式一在[first,last)范围内查找一组共count个连续的值,这些值都与value相等。如果不能找到这样的一组数值就返回last。找到符合条件的串后返回的迭代器指向其首部。 形式二在[first,last)范围内查找一组共count个连续的值,当将所有这些值与value传递给binary_pred时满足条件后返回true。如果不能找到这样的一组数值就返回last。找到符合条件的串后返回的迭代器指向其尾部。 ForwardIterator search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value); ForwardIterator search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value, BinaryPredicate binary_pred); min_element()返回一个迭代器,该迭代器指向范围内“最小的”值首次出现的位置。如果范围内为空则返回last。 形式一用 operator< 执行比较,且返回值为r,其意义是:对范围[first,r)中每个元素e,*e < *r 都为假。 形式二用binary_pred比较,且返回值为r,其意义是:对于范围[first,r)中每个元素e,binary_pred(*e, *r)都为假。 ForwardIterator min_element(ForwardIterator first, ForwardIterator last); ForwardIterator min_element(ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred); max_element()返回一个迭代器,该迭代器指向范围内“最大的”值首次出现的位置。如果范围内为空则返回last。 形式一用 operator< 执行比较,且返回值为r,其意义是:对范围[first,r)中每个元素e,*r < *e 都为假。 形式二用binary_pred比较,且返回值为r,其意义是:对于范围[first,r)中每个元素e,binary_pred(*r, *e)都为假。 ForwardIterator max_element(ForwardIterator first, ForwardIterator last); ForwardIterator max_element(ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred); 替换函数:都从头到尾在范围[first,last)内进行查找,找到与标准匹配的值并用new_value替换它们。 replace()和replace_copy()都是仅仅查找old_value并对其进行替换。 replace_if()和replace_copy_if()查找妈祖判定函数pred的值。 函数的“复制”形式不修改原始范围,而是将作为替代的一个副本赋给result,更换它的值。 void replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value); void replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value); OutputIterator replace_copy(InputIterator first, InputIterator last, OutputIterator result, const T& old_value, const T& new_value); OutputIterator replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value); 比较范围: 如果两个范围完全相同(有相同的元素和相同的顺序),equal()函数返回真。 形式一中由operator==执行比较。 形式二由binary_pred来决定两个元素是否相同。 bool equal(InputIterator first1, InputIterator last1, InputIterator first2); bool equal(InputIterator first1, InputIterator last1, InputIterator first2 BinaryPredicate binary_pred); lexicographical_compare()判断第1个范围是否“字典编纂顺序的小于”第2个范围,小于则返回true,否则返回false。 形式一中由operator< 执行比较。 形式二中使用判定函数binary_pred。 bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, BinaryPredicate binary_pred); mismatch()告诉比较从哪里开始不同。如果没有出现不匹配,返回值是与第2个范围结合在一起的超越末尾的迭代器last1。 pair模板类是一个struct,该struct含有两个用成员名first和second表示的元素,在头文件中定义。 形式一使用operator==。 形式二使用binary_pred。 pair mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); pair mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred); 删除元素: 因为STL的通用性,这里对删除的概念有一点限制。 STL“删除”函数重新排列该序列,就是将“已被删除的”元素排在序列的末尾,“未删除的”元素排在序列的开头。然后函数返回一个指向序列的“新末尾”元素的迭代器,这个“新末尾”元素是不含被删除元素的序列的末尾,也是被删除元素序列的开头。换句话说,如果new_last是从“删除”函数返回的迭代器,则范围[first,new_last)是不包含任何被删除元素的序列,而范围[new_last,last)是被删除元素组成的序列。 每一种“删除”形式都从头至尾遍历范围[first,last),找到符合删除标准的值,并且复制未被删除的元素(这个元素是随机的)覆盖已被删除的元素。未被删除的元素的原始排列顺序仍然保持。返回值是指向超越范围末尾的迭代器,该范围不包含任何已被删除的元素。 “if”版本的删除把每一个元素传递给判定函数pred(),来决定是否应该删除(如果pred()返回true,则删除该元素)。“copy”版本的删除不需要修改原始序列,而取而代之是复制未被删除的值到一个开始于result的新范围,并返回指向新范围的超越末尾的迭代器。 remove()的返回值是称为new_last的迭代器。 ForwardIterator remove(ForwardIterator first, ForwardIterator last, const T& value); ForwardIterator remove_if(ForwardIterator first, ForwardIterator last, Predicate pred); OutputIterator remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value); OutputIterator remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred); “unique”函数的每一个版本都从头至尾遍历范围[first,last),找到相邻的相等值,并且通过复制覆盖它们来“删除”这些副本。未被删除的元素的原始仍然保持不变。返回值是指向该范围的超越末尾的迭代器,该范围相邻副本已被删除。“copy”版本的不改变原始序列,而取而代之是复制未被删除的值到一个开始于result的新范围,并返回指向新范围的超越末尾的迭代器。 ForwardIterator unique(ForwardIterator first, ForwardIterator last); ForwardIterator unique(ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred); OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result); OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate binary_pred); 对已排序的序列进行排序和运算: 对已排好序的序列进行包括排序或运算的每个算法都有两种版本。第1种版本使用对象自己的operator< 来执行比较。第2种版本用operator()(a,b)来决定a和b的相对顺序。 1.排序 升序排列 void sort(RandomAccessIterator first, RandomAccessIterator last); void sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering binary_pred); 升序排列,保持相等元素的原始顺序(假设元素可以是相等的但不是相同的) void stable_sort(RandomAccessIterator first, RandomAccessIterator last); void stable_sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering binary_pred); 对一定数量的元素排序,这些元素可以放入范围[first,middle)中,排序结束,在范围[middle,last)中其余的那些元素并不保证它们的顺序。 void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last); void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, StrictWeakOrdering binary_pred); partial_sort()的复制版本: RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last); RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, StrictWeakOrdering binary_pred); nth_element()部分处理(排序)范围内的元素,它比partial_sort()要少处理得多。nth_element()唯一保证的是无论选择什么位置,该位置都会称为一个分界点。但任何一个子范围都不会是一个以特定的顺序排好序的序列,这不像partial_sort(),它的第1个范围已排好序。如果需要的是很弱的排序处理,这个算法要比partial_sort()快得多。 void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last); void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, StrictWeakOrdering binary_pred); 2.在已排序的范围中找出指定元素 判定value是否出现在已排序的范围[first,last)中。 bool binary_search(ForwardIterator first, ForwardIterator last, const T& value); bool binary_search(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering binary_pred); 返回的迭代器指出value在已排序的范围[first,last)中第1次出现的位置。如果value没有出现,返回的迭代器则指出它在该序列中应该出现的位置。 ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value); ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering binary_pred); 返回的迭代器指出在已排序的范围[first,last)中超越value最后出现的一个位置。如果value没有出现,返回的迭代器则指出它在该序列中应该出现的位置。 ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T& value); ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering binary_pred); 3.合并已排序的序列 merge()从[first1,last1)和[first2,last2)中复制元素到result,在结果范围的序列以升序排列。是一个稳定算法。 OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering binary_pred); 假定[first,middle)和[middle,last)是在相同的序列中已排好序的两个范围。合并这两个范围序列到一个结果序列,该结果序列范围[first,last)包含将两个排好序的范围结合成一个有序的范围。 void inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last); void inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, StrictWeakOrdering binary_pred); 4.在已排序的序列上进行集合运算 如果[first2,last2)是[first1,last1)的一个子集,返回true。 bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, StrictWeakOrdering binary_pred); 在result范围中创建两个已排序范围的数学并集,返回值指向输出范围的末尾。 OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering binary_pred); 在result中产生两个输入集合的交集,返回值指向输出范围的末尾,即在两个输入集合中都出现数值的集合。 OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering binary_pred); 在result中产生数学上集合的差,返回值指向输出结果范围的末尾。所有出现在[first1,last1)中,但不在[first2,last2)中出现的元素都放入结果集合。 OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering binary_pred); 在result集合构成中,包括: 1.所有在集合1中而不在集合2中的元素。 2.所有在集合2中而不在集合1中的元素。 返回值指向输出范围的末尾。 OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering binary_pred); 堆运算: 将一个任意序列范围转化成堆。 void make_heap(RandomAccessIterator first, RandomAccessIterator last); void make_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering binary_pred); 向由范围[fist,last-1)决定的堆中增加元素*(last-1)。即将最后一个元素放入堆中合适的位置。 void push_heap(RandomAccessIterator first, RandomAccessIterator last); void push_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering binary_pred); 将最大的元素(在运算前实际上在*first中)放入位置*(last-1)并且重新组织剩余的范围,使其仍然在堆的顺序中。 void pop_heap(RandomAccessIterator first, RandomAccessIterator last); void pop_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering binary_pred); 使一个以堆顺序排列的序列转化成普通的排列顺序,这样它就不在是一个堆。这是一个不稳定的排序。 void sort_heap(RandomAccessIterator first, RandomAccessIterator last); void sort_heap(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering binary_pred); 对某一范围内的所有元素进行运算: 这些算法遍历整个范围并对每个元素执行运算。 transform()将每个运算的结果放入一个目的序列(也可以是原始序列)。 for_each()对[first,last)中的每个元素应用函数对象f,并丢弃运算的返回值。 UnaryFunction for_each(InputIterator first, InputIterator last, UnaryFunction f); 模板定义: template Function for_each(InputIterator first, InputIterator last, Function f) { while(first != last) { f(*first++); } return f; } transform()对范围[first,last)中的每个元素应用函数对象f,并将结果复制(使用operator=)到*result,每次复制后增加result的内容。返回值是超越末尾的迭代器。 形式一调用了f(*first)。第1个范围表示一个输入序列。 形式二调用了f(*first1,*first2),第2个输入范围的长度由第1个输入范围的长度决定。 OutputIterator transform(InputIterator first, InputIterator last, OutputIterator result, UnaryFunction f); OutputIterator transform(InputIterator1 first, InputIterator1 last, InputIterator2 first2, OutputIterator result, BinaryFunction f); 数值算法: 这些算法都包含在头文件中 合计,对于由迭代器i指向的[first,last)中的每一个元素,执行运算result=result+*i或f(result,*i)。 T accumulate(InputIterator first, InputIterator last, T result); T accumulate(InputIterator first, InputIterator last, T result, BinaryFunction f); 计算两个范围[first1,last1)和[first2,first2+(last1-first1))的一个广义内积。即用第1个序列中的元素乘以第2个序列中“平行的”元素并对其积进行累加来产生返回值。 参数init是内积的初始值。 T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init); T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryFunction1 op1, BinaryFunction2 op2); 计算一个广义部分和。创建一个新的在result开始的序列。新序列中每个元素都是[first,last)范围中从第1个元素到当前选择的元素之间所有元素的累加和。 返回值指向输出范围[result,result+(last-first))的末尾。 例如,原始序列是{1, 1, 2, 2, 3}, 结果序列是{1, 1 + 1, 1 + 1 + 2, 1 + 1 + 2 + 2, 1 + 1 + 2 + 2 + 3}, 即{1, 2, 4, 6, 9}。 OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result); OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryFunction op); 计算全部范围[first,last)中的相邻元素的差。即在新序列中,每个元素的值是原始序列中当前元素与前面的元素的差值(第1个值不变)。 返回值指向输出范围[result,result+(last-first))的末尾。 例如,原始序列是{1, 1, 2, 2, 3},结果序列是{1, 1 – 1, 2 – 1, 2 – 2, 3 – 2}, 即{1, 0, 1, 0, 1}。 OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result); OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryFunction op); 通用实用程序: pair是一个简单的将两个对象(可能不同类型的对象)封装成一个对象的方法。当需要从一个函数返回多个对象时使用它是很典型的情况,也可以用来创建一个持有pair对象的容器,或将多个对象作为一个参数进行传递。通过p.first和p.second来访问指定的元素,这里p是pair对象。 如果想“在执行中”创建一个pair,典型的方法是使用模板函数make_pair(),它会自动推断出它接收到的参数的类型。 (Templates in the header) template struct pair; template pair make_pair(const T1&, const T2&); 计算first与last之间的元素个数。返回一个整数值。 (From ) difference_type distance(InputIterator first, InputIterator last); 用来为给定的容器创建迭代器,以便向容器插入元素。每种类型的迭代器对插入使用不同的运算。 (From ) back_insert_iterator back_inserter(Container& x); front_insert_iterator front_inserter(Container& x); insert_iterator inserter(Container& x, Iterator i); 返回两个参数中较小的一个,或如果两个参数相等则返回第1个参数。 const LessThanComparable& min(const LessThanComparable& a, const LessThanComparable& b); const T& min(const T& a, const T& b, BinaryPredicate binary_pred); 返回两个参数中较大的一个,或如果两个参数相等则返回第1个参数。 const LessThanComparable& max(const LessThanComparable& a, const LessThanComparable& b); const T& max(const T& a, const T& b, BinaryPredicate binary_pred); 使用赋值的方法来交换a和b的值,所有的容器类都使用特化的swap()版本。 iter_swap()交换它涉及的两个参数的值。 void swap(Assignable& a, Assignable& b); void iter_swap(ForwardIterator1 a, ForwardIterator2 b);
国产大模型 coding plan 实战决策指南:GLM、Kimi、豆包、abab 四大模型分层选型与工程落地 大模型辅助编程(coding assistant)正从概念验证走向规模化工程落地,其核心已不再是‘能否生成代码’,而是‘如何在真实开发流程中精准赋能’。理解模型能力边界、匹配技术栈特征、构建分层工作流(L1行级补全/L2函数生成/L3模块重构),是实现稳定提效的关键。GLM系列以工程稳定性见长,适合代码审计与测试生成;Kimi-Max凭借200K超长上下文胜任深度重构与合规审查;豆包响应快、框架适配深,是IDE高频补全的理想选择;abab系列则在IoT固件等跨模态场景中展现独特价值。本文聚焦国产模型在金融、 阅读详情

相关推荐

保姆级教程:在Ubuntu 22.04上从零安装SUMO并运行第一个交通仿真

本教程详细介绍了在Ubuntu 22.04系统上从零安装SUMO交通仿真软件并运行第一个仿真的完整流程。涵盖环境准备、PPA源安装、核心组件验证、首次仿真案例运行以及进阶配置技巧,特别针对netedit路网编辑器和地图格式转换等实用工具进行重点讲解,帮助用户快速掌握SUMO在交通仿真领域的应用。

weixin_30546189的博客 420

【设计模式——学习笔记】23种设计模式——迭代器模式Iterator(原理讲解+应用场景介绍+案例介绍+Java代码实现)

讲解迭代器模式的思想,介绍其常见的应用场景,举例说明其实现方式

我只管埋头前行,剩下的交给时间。 2729

R语言影像组学实战:从医学图像到预测模型的完整流程(附代码)

本文详细介绍了使用R语言进行影像组学分析的完整实战流程。从环境搭建、数据准备,到医学图像的特征提取与筛选,再到利用机器学习构建预测模型并进行评估,提供了清晰的步骤和可运行的R代码示例,帮助研究者和数据分析师掌握从医学图像到临床预测模型的核心技术。

qsc901234的博客 732

迭代器模式

定义 迭代器(Iterator)模式的定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。迭代器模式是一种对象行为型模式。 在学习Java集合的时候,我们要访问容器内的对象,就要知道容器的结构,如ArrayList要用get来获取对象,而set只能用迭代器或for each循环。所以,当容器类型很多时,使用是不方便的,我们需要一种接口,这个接口可以遍历容器的对象,而...

Endeavor_G的博客 1993

onnxruntime模型部署(一)-pythonAPI

简单模型的onnx模型的导出,以及onnxruntime推理引擎的模型部署

qq_45983373的博客 4059

利用Dify平台打造大学生专属AI模拟面试助手:从零到精通的完整指南

在这个充满竞争的就业市场中,拥有一个24小时在线的AI面试教练无疑是大学生求职路上的秘密武器。通过本文的指导,你已经掌握了使用Dify平台构建专业级模拟面试助手的全套技能。从环境部署、模型选择,到Prompt设计、知识库集成,再到高级功能开发和效果优化,我们一步步打造了一个能够适应不同岗位、提供专业反馈的智能面试系统。无论是技术岗的算法问答,还是咨询业的案例分析,或是外企的英语面试,你的定制助手都能提供针对性训练。更重要的是,这个方案具有极强的可扩展性。

专注于编程、AI、人工智能等多个领域内容研究和分析 2789

迭代器模式介绍

1. 迭代器模式(Iterator Pattern)是常用的设计模式,属于行为型模式 2. 如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。 3. 迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。

KEEP 300

什么是 SAP Fiori 的 Technical Catalog

笔者之前的文章曾经提到一个叫做本文介绍 Technical Catalog 这个概念在 SAP Fiori 技术体系中的作用。首先我们如何在系统里查看这个 Catalog SAP_BASIS_TCR_T 里面包含的内容呢?如果大家照着本文开头那篇文章里提到的步骤,那么在自己系统里会创建好名叫的 PFCG role.我们登录 ABAP 系统,启动事务码 PFCG,打开这个 role, 就能看到它。展开之后,发现它扮演着一个容器的角色,里面包含了很多 ABAP 对象。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 742

24.集合的遍历(单列集合、双列集合)

迭代器遍历是一种在编程中常用的集合遍历方式。迭代器是一种对象,用于按顺序访问集合中的元素,并且可以进行元素的增删操作。迭代器提供了一种统一的访问集合元素的方式,不依赖于集合的具体实现。增强for循环(Enhanced for Loop),也被称为for-each循环,是Java中一种用于遍历集合或数组元素的简化循环结构。它提供了一种更简洁、易读的方式来遍历集合中的元素,无需手动使用索引或迭代器。Lambda表达式是Java 8引入的一种函数式编程的特性,它提供了一种更简洁、灵活的方式来表示匿名函数。

kuxiaoyang的博客 1760

【嘉立创EDA】从AD21导入pcb边界到嘉立创EDA专业版

有许多前期工程由AD进行完成,在后续update的过程中,由于开模等原因限制,部分pcb外型需要继续沿用,本文将此过程记录,以供有需要的读者参考。

l64481000的博客 4516

【银河麒麟V10】【桌面】【服务器】系统启动问题

1、如果之前运行好好的,重启后系统报错,一般80%是因为fstab的问题,回想下之前有没有添加过外接存储,修改过/etc/fstab,如果是的话一般是因为存储异常(比如网络存储无法连接,本地存储路径变化)导致系统开机自检失败,导致无法正常启动; 处理方式:进入单用户(单用户进入的几种方式上面有专门文章介绍),修改/etc/fstab,将新增的内容暂时注释掉,然后重启系统,能正常进入系统后再分析失败原因。 ...

桂安俊@KylinOS 3万+

C++——迭代器

C++中的迭代器是一种对象,可以用于遍历容器类型(如vector、list等)中的元素。C++中有多种类型的迭代器,包括正向迭代器、反向迭代器、常量迭代器等。其中,container表示容器类型(如vector、list等),iterator表示迭代器类型,it表示定义的迭代器对象名称。- 常量反向迭代器(const_reverse_iterator):可以访问被定义为const的容器中的元素,但不能修改它们。C++中有多种迭代器类型,如正向迭代器、反向迭代器、常量迭代器等。

m0_48748418的博客 1400

Vue3 - H5实现省市区三四级联动组件,选择地址自定义省市区三级联动插件,弹框式多级联动选择器区域选择,vue3实现省市区三级联动地址选择组件(支持接口数据懒加载,样式精美漂亮,附带详细示例源码)

vue3实现省市区三级联动地址选择组件(附address文件),vue3实现省市区三级联动, 实现省、市、县地区三级联动功能,vue3省市区选择器,VUE3 h5如何实现省市区街道的四级联动选择,vue实现省市区选择联动,vue3城市三级联动(自定义组件)_VUE三级联动,插件省市区联动,vue如何实现省市区选择器,vue3怎样实现省市区地址三级联动,vue四级联动,vue3级联选择器,vue3实现选择省市区镇(街道)四级级联选择,包含三级级联选择,省市区街道三级四级联动选择器,VUE3自定义多列选择器省市

🏆 前端领域优质创作者 3068

五 STL算法概述

一 概述: (1)算法的一般形式: *所有泛型算法的前两个参数都是一对迭代器,通常称为first和last,用以标示算法的操作区间。 *这个[first,last)区间的必要条件是,first必须能够经由累加(increment)操作符的反复运用,从first到达list。 *任何一个STL算法的声明都,都表现出它所需要的最低程度的迭代器类型。 *许多的STL算法不只支持一个版本,某个版

linux系统、网络编程和分布式计算 918

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

<C++学习笔记>iterator C++

  迭代器是指向数据集合(比如数组、容器)中的元素的数据类型,它可以通过一系列的操作(如自增运算符++,取值运算符*)遍历数据集合中的元素。     迭代器的一种显著形式是指针。指针可以指向数组中的元素,可以通过自增操作“++”遍历数组中的元素。此外迭代器还有其他形式,例如,每一种类型的容器,如vector,都设置有一个特定形式的“iterator”用于高效低遍历其中的元素。     注意...

weixin_34288121的博客 133

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【C++】迭代器、反向迭代器详解

http://c.biancheng.net/view/338.html https://blog.youkuaiyun.com/kjing/article/details/6936325 https://blog.youkuaiyun.com/qq_22194315/article/details/57144854 一、迭代器 1. 概述 要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读..

lemonxiaoxiao的博客 6037

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。 迭代器按照定义方式分成以下四种。 1) 正向迭代器,定义方法如下: 容器类名::iterator 迭代器名; 2) 常量正向迭代器,定义方法如下: 容器类名::const_iterator 迭代器名; 3) 反向迭代器,定义方法如下: 容器类名::revers

m0_49330686的博客 1万+

C++迭代器

什么是迭代器: C++中,迭代器就是一个类似于指针的对象,它能够用来遍历C++标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。以下面的string为例子介绍说明。 对string 对象s1正向遍历输出,代码如下所示: string::iterator it = s.begin(); //此处的begin()函数有两个重载函数,分别是 //iterator begin(); //const_iterator begin() const; //调用他们的对象,分别是可以

weixin_41368411的博客 2万+

什么是迭代器,JS如何实现迭代器

1.背景知识 1)迭代的定义:从一个数据集合中按照一定的顺序,不断取出数据的过程称为迭代 2)迭代和遍历的区别 迭代:迭代强调的是依次取数据的过程,并不保证取多少,也不保证把所有的数据都取完 遍历:遍历强调的是要把整个数据依次全部取出 3)迭代器:对迭代过程的封装,在不同的语言中有不同的表现形式,通常为对象 4)迭代模式:一种设计模式,用于统一迭代过程,迭代模式规范了迭代器规格 迭代器应该具有得到下一个数据的能力 迭代器应该具有判断是否还有后续数据的能力 2.JS中的迭代器 JS规定,如果

桃花扇的博客 4015

什么是python的迭代器,迭代器有什么好处

【前言】 在初级研发或测试面试中总会被问到什么是python的迭代器,有什么好处?这个看似很简单的话题说起来似乎感觉自己并不是特别清楚的能讲出来。所以本文记录下自己查阅很多资料后的总结。 【什么是迭代器】 迭代器是python最强大的功能之一,是访问集合元素的一种方式 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stoplteration异常,以终止迭代(只能往后走,不能往前退) 2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一

Be_Nice的博客 9514

C++ 迭代器 Iterator

C++ 迭代器 Iterator

chenyfan_blog 8189

Lua迭代器如何使用?

迭代器是一种设计模式,它提供了一种访问集合元素的方法,而不需要暴露其底层结构。在Lua中,迭代器通常以一个函数的形式表示,每次调用该函数时,它会返回集合中的下一个元素。当没有更多元素时,迭代器返回nil。在Lua编程语言中,迭代器是一种允许程序员遍历数据集合的重要工具。它让开发者可以访问集合中的每一个元素,而无需暴露集合的内部结构。根据是否保存遍历过程的状态,迭代器被分为两种类型:无状态迭代器和多状态迭代器。下面我们将详细介绍这两种迭代器,并提供具体的语法和示例帮助理解。

2301_82300081的博客 1472

迭代器概述

3>实现Iterable 接口的类才可以使用迭代器和增强for,Collection已经实现了Iterable接口。它是JDK5之后出现的,其内部原理是一个Iterator迭代器,遍历集合相当于是迭代器的简化写法。Iteratoriterator() : 得到迭代器对象,默认指向当前集合的索引0。迭代器在java中的代表是Iterator , 迭代器是集合的专用遍历方式。遍历是一个个的把容器的元素访问一遍。4.集合存储的是对象的地址。

m0_70905607的博客 304

c++ 迭代器

​ 迭代器是C++ STL的核心组件,充当容器与算法之间的桥梁。它提供了一种 通用且安全的方式来遍历容器元素 ,隐藏了容器的具体实现细节1。通过模拟指针的行为,迭代器实现了对容器元素的灵活访问和操作,使程序员能够在不了解容器内部结构的情况下高效地处理各种数据结构2。这种设计不仅提高了代码的可移植性和可维护性,还增强了C++程序的整体性能和可靠性。

2401_86544677的博客 1029

迭代器用法详解

迭代器实际上是一种用来遍历容器元素的数据类型(作用类似与C语言的指针)。从此就可以看出,迭代器与容器的密切联系。我们知道,一些容器(如vector)可以通过[ ]来访问容器元素,但这种方式并不普遍,因为大多数的容器并不是数组实现的,也就不能用[]来访问容器元素。因此C++中就需要一种更加普遍的工具来提高效率,这就是迭代器。迭代器是一种数据类型,一种变量。它也有几种类型,输入迭代器,输出迭代器,前向迭代器,双向迭代器,随机迭代器。所以它支持++,--,>,=,

2301_78933228的博客 2950

C++ stl迭代器 (迭代器失效问题)_c++ 迭代器失效

🥦 迭代器是指向元素范围(如数组或容器)中的某个元素的任何对象,它能够使用一组运算符(至少具有自增(++) 和解引用 (*) 运算符)循环访问该范围的元素。🍊 迭代器最明显的形式是指针:指针可以指向数组中的元素,并且可以使用增量运算符 (++) 循环访问这些元素。但其他类型的迭代器也是可能的。例如,每个容器类型(如list )都有一个特定的迭代器类型,旨在循环访问其元素。

2401_87255253的博客 1338
上一篇: QT 事件优先级
下一篇: QT Q_D && Q_Q
bitscro
博客等级 码龄21年 19粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值