c/c++ 标准库 迭代器(iterator)

c/c++ 标准库 迭代器

begin和end运算符返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回const_iterator;如果对象不是常量,返回iteraotor

1,但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。

2,不能在范围for循环中向vector对象添加元素

标准库 迭代器(iterator)的小例子

test1~test8

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main(){

  //test1
  /*
  string s("abc bdc");
  auto it = s.begin();
  while(it != s.end()){
    *it = toupper(*it);
    ++it;
  }
  cout << s << endl;
  */

  //test2
  /*
  string s("abd ddd");
  for(auto it = s.begin(); it != s.end() && !isspace(*it); ++it){
    *it = toupper(*it);
  }
  cout << s << endl;
  */

  //test3 不可改变vector::const_iterator类型
  /*
  vector<int>:: iterator it;
  vector<int>:: const_iterator it2;
  vector<int> v(5,1);
  it = v.begin();
  it2 = v.begin();
  vector<int> const cv(5,2);
  //it = cv.begin();//it是可改变的vector::iterator,所以编译错误
  for(auto s : v){
    cout << s;
  }
  cout << endl;
  */

  //test4 不可改变string::const_iterator类型
  /*
  string::iterator sit;
  string::const_iterator sit2;
  string s1("abc");
  sit2 = s1.begin();
  while(sit2 != s1.end()){
    //*sit2 = toupper(*sit2);
    cout << *sit2;
    ++sit2;
  }
  cout << endl;
  */

  //test5 cbegin和cend,返回const类型的iterator
  /*
  string s1("aaaa");
  auto it1 = s1.cbegin();
  //*it1 = ‘c‘;//不可以通过const类型的iterator改变原来的对象
  cout << s1 << endl;                                                           

  vector<int> v(4,2);
  auto vit1 = v.cbegin();
  //*vit1 = 5;//不可以通过const类型的iterator改变原来的对象
  */

  //test6 string迭代器运算
  /*
  string s("abcd");
  string s1("abc");
  vector<int> v(5,3);
  auto it1 = s.begin();
  auto it2 = s.begin();
  if(it1 == it2){
    cout << "=" << endl;
  }
  ++it1;
  it1 += 1;
  if(it1 > it2){
    cout << ">" << endl;
    cout << it1 - it2 << endl;
  }
  string::difference_type juli = it1 - it2;
  cout << juli << endl;
  */

  //test7 vector迭代器运算
  /*
  vector<string> s(4,"abcd");
  vector<string> s1(5,"abc");
  auto it1 = s.begin();
  auto it2 = s.begin();
  if(it1 == it2){
    cout << "=" << endl;
  }                                                                             

  ++it1;
  it1 += 1;
  if(it1 > it2){
    cout << ">" << endl;
    cout << it1 - it2 << endl;
  }
  vector<string>::difference_type juli = it1 - it2;
  cout << juli << endl;
  */

  //test8 利用迭代器实现二分法
  vector<string> v{"a","b","c","d","e"};
  string target("b");
  vector<string>::size_type idx = 0;
  auto beg = v.begin();
  auto mid = v.begin() + v.size() / 2;
  auto end = v.end();
  while(mid != end && *mid != target){
    if(target < *mid)
      end = mid;
    else
      beg = mid + 1;
    mid = beg + (end - beg) / 2;
  }
  if(mid == end){
    cout << "not found" << endl;
  }
  else{
    idx = mid - v.begin();
    cout << idx << ":" << *mid << endl;
  }
}

原文地址:https://www.cnblogs.com/xiaoshiwang/p/9623559.html

时间: 2024-08-03 22:28:55

c/c++ 标准库 迭代器(iterator)的相关文章

STL标准库-迭代器

摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 本节主要介绍STL六大部件中的Iterators迭代器. 在语言方面讲,容器是一个class template, 算法是一个仿函数, 分配器class template, 迭代器是一个class template, 适配器class template, 分配器class template 从图中我们可以看出算法是看不到容器的,容器跟算法的交互必要用迭代器做桥梁,那么迭代器是怎样让容器和算法满足各自的需求的呢?

把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 相关的内存,因为vetcor是类模版,对应多个不同类型,比如int,string,或者自己定义的数据类型等. 程序开头应如下声明 #include <iostream> #include <vector> #include <string> using std::strin

【转】C++ 标准库值操作迭代器的常见函数

迭代器是C++标准库中的重要组件,特别是在容器内部,没有迭代器,容器也就无所谓存在了. 例如:vector容器简而言之就是3个迭代器 start finish 以及end_of_storage vector的任何操作都离不开这3个迭代器.. 接下来,总结一下C++ 中的迭代器的操作. C++的迭代器分为5类,依次为 : Input_iterator, output_iterator, forwrd_iterator, bidirectional_iterator 以及  random_acces

C++标准库之迭代器

迭代器是对指针进行进一步抽象的产物. 迭代器是遍历所有容器(序列)/流的统一界面,是标准库泛形算法的基础. 迭代器根据其能力分为五种: category properties valid expressions all categories copy-constructible, copy-assignable and destructible X b(a);b = a; Can be incremented ++aa++ Random Access Bidirectional Forward

Python标准库:迭代器Itertools

Infinite Iterators: Iterator Arguments Results Example count() start, [step] start, start+step, start+2*step, ... count(10) --> 10 11 12 13 14 ... cycle() p p0, p1, ... plast, p0, p1, ... cycle('ABCD') --> A B C D A B C D ... repeat() elem [,n] elem

C++ Primer 学习笔记_8_标准库类型(续2) -- iterator

 标准库类型(三) --iterator 序言: 迭代器是一种检查容器内元素并遍历容器元素的数据类型. 所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作:因此,现代C++更倾向于使用迭代器而不是下标操作访问容器元素. 正文: 1.容器的iterator类型 每个标准库容器类型都定义了一个名为iterator的成员: [cpp] view plaincopyprint? vector<int>::iterator iter; vector<int>::ite

C++ 标准库值操作迭代器的常见函数

迭代器是C++标准库中的重要组件,特别是在容器内部,没有迭代器,容器也就无所谓存在了. 例如:vector容器简而言之就是3个迭代器 start finish 以及end_of_storage vector的任何操作都离不开这3个迭代器.. 接下来,总结一下C++ 中的迭代器的操作. C++的迭代器分为5类,依次为 : Input_iterator, output_iterator, forwrd_iterator, bidirectional_iterator 以及  random_acces

STL标准程序库第一部分总结(Auto_ptr&amp;&amp;numeric_limits,标准模板库,迭代器的配接器)

一 Auto_ptr的使用 1 auto_ptr 拥有权的转移(auto_ptr要求一个只能有一个对象只能有一个拥有者,严谨一无二主) Std::auto_ptr<ClassA>ptr1(new ClassA) Ptr1拥有new出来的对象 Std::auto_ptr<ClassA>ptr2(ptr1) 把控制权交给ptr2此后ptr2就拥有了new出来的对象而ptr1不在拥有它了 2通过赋值实现 Std::auto_ptr<ClassA>ptr1(new ClassA

C++标准库vector以及迭代器

今天看C++的书,出现了一个新的概念,容器vector以及容器迭代器. vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存.引入头文件 #include<vector> 1.vector对象的定义和初始化 1 vector<T> v1 vector保存类型为T的对象.默认构造函数,v1为空 2 vector<T> v2(v1) v2是v1的一个副本 3 vector<T> v3(n,