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;
}
}

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

  1. STL标准库-迭代器适配器

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 这次主要介绍一下迭代器适配器.以reverse_iterator(反向迭代器),insert_iterator(插入迭代器),o ...

  2. STL标准库-迭代器

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 本节主要介绍STL六大部件中的Iterators迭代器. 在语言方面讲,容器是一个class template, 算法是一个仿函 ...

  3. PHP SPL标准库-迭代器

    通过某种统一的方式遍历链表或者数组中的元素的过程叫做迭代遍历,这种统一的遍历工具我们叫做迭代器. PHP中迭代器是通过Iterator 接口定义的. ArrayIterator迭代器 foreach ...

  4. C++ Primer 第三章 标准库类型vector+迭代器iterator 运算

    1.vector: 标准库类型vector表示对象的集合,其中所有对象的类型都相同,集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它也常被称作容器( ...

  5. C++标准库类型vector及迭代器iterator简介

    Vector是C++标准库类型,称为容器,一个容器中的所有对象必须是同一种类型的.与数组相比,其最大的优点就是动态增长.Vector是一个类模板,并不是数据类型,而vector<int>和 ...

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

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 ...

  7. C++ Primer 有感(标准库vector及迭代器)

    vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存.引入头文件 #include<vector> 1.vecto ...

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

    今天看C++的书,出现了一个新的概念,容器vector以及容器迭代器. vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存. ...

  9. C++标准库vector及迭代器

    vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存.引入头文件 #include<vector> 1.vecto ...

随机推荐

  1. Win32之内存管理之虚拟内存跟物理内存

     Win32之内存管理 一丶虚拟内存和物理内存 我们知道每个应用程序都有自己独立的4GB空间.  假设A进程的 地址123 存储了10  那么B进程的123地址 存储了20 那么它们两个是互不影响的. ...

  2. 深入学习主成分分析(PCA)算法原理(Python实现)

    一:引入问题 首先看一个表格,下表是某些学生的语文,数学,物理,化学成绩统计: 首先,假设这些科目成绩不相关,也就是说某一科目考多少分与其他科目没有关系,那么如何判断三个学生的优秀程度呢?首先我们一眼 ...

  3. TensorFlow中的并行执行引擎——StreamExecutor框架

    背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 在前一篇文章中,我们梳理了TensorFlow中各种异构Device的添加和注 ...

  4. TP3.2 URL传参及模板输出

    本例子结合layer.open使用 HTML代码 onclick="return stulist(167,25);" JS代码 <script type="text ...

  5. Linux中文件MD5校验

    md5sum命令用于生成文件的md5数字摘要,并可以验证文件内容是否发生了改变,间接地还可以检验两个文件内容是否完全相同.因为md5sum是读取文件内容来计算校验码的,因此只能验证文件内容,而无法验证 ...

  6. python按引用赋值和深、浅拷贝

    按引用赋值而不是拷贝副本 在python中,无论是直接的变量赋值,还是参数传递,都是按照引用进行赋值的. 在计算机语言中,有两种赋值方式:按引用赋值.按值赋值.其中按引用赋值也常称为按指针传值(当然, ...

  7. 华为路由器 HDLC 实验

    HDLC 简介 高级数据链路控制(High-Level Data Link Control 或简称 HDLC),是一个在同步网上传输 数据.面向比特的数据链路层协议,它是由国际标准化组织(ISO)根据 ...

  8. Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署动态网站(二)--技术流ken

    项目前言 在上一篇博客<Jenkins+Git+Gitlab+Ansible实现持续化集成一键部署静态网站(一)--技术流ken>中已经详细讲解了如何使用这四个工具来持续集成自动化部署一个 ...

  9. 使用JS模拟锚点跳转

    A-HTML锚点定义: 设置锚: <a href="#mao">&nsbp;</a> 设置点:(为了浏览器兼容性,id和name一起设置) < ...

  10. ListView的setOnItemClickListener位置错乱问题

    如果你对一个ListView同时addHeaderView(listhHeaderView),也就是头部视图,再加setAdapter,当你加上setOnItemClickListener事件后你会发 ...