`
yunchow
  • 浏览: 317720 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

C++容器与迭代器

    博客分类:
  • C++
阅读更多
* 容器的迭代器还有几种:
   + iterator:正常迭代器(常用)
   + reverse_iterator:反向迭代器(有时也用)
- rbegin(),rend()//返回反向迭代器
   + const_iterator:常量迭代器
   + const_reverse_iterator:

iterator find(数据){
	for( 从beg;!=end;it ++)
		if(*it==数据)
			return it;
	return end;//未找到,返回无效迭代器
}//查询
*it = new_data;//更新迭代器

--------------------------------
所有的容器在插入数据时会自动加长,程序员不必关心空间问题.
容器的分类:
  + (sequence)
- vector
- list
- deque
序列式容器共性
构造函数:constructor(int n);constructor(int n,T val)
调整大小:resize(int n),resize(int n,T val)一般用来加长,不一定能缩短
赋值:assign(n,val),放入n个相同的值
     assign(区间(beg--end),val),把指定区间的内容放入容器
插入:insert(pos/*迭代器*/,n,val),insert(pos,区间)
毛插:push_back(val);//在末尾插入新数据
取得首尾元素:front(),back()
尾删:pop_back();//删除尾部元素
-----------------------------------
序列式容器不同点
vector 类似于数组,也支持'[]',不做越界检查,但更安全;能自动增长.
vector.at(下标);//如果越界会throw异常,返回的是引用
vector.reserve(n)//保留空间(没必要用)
vector.capacity()//目前容量(没必要用),用size()
vector只适合在末尾插入和删除数据
vector的查找效率高而list低
list对于频繁的插入与删除做了优化.
凡是标准库抛出的异常都可以用exception类来catch
//vector例子
#include <iostream>
using namespace std;
#include <vector>

int main()
{
        vector<int> vi;
        cout << "Input scores,end by -1:";
        int s;
        int m=0;
        for(;;){
                cin >> s;
                if(s==-1) break;
                vi.push_back(s);
                if(s>m)
                        m = s;
        }
        int inc = 100-m;
        for(int i=0; i<vi.size(); i++)
                vi[i] += inc;
        for(int i=0; i<vi.size(); i++)
                cout << vi[i] << ' ';
        cout << endl;
        try{
        cout << "vi[1000]=" << vi[1000] << endl;
        cout << "vi.at(1000)=" << vi.at(1000) << endl;
        }catch(exception& e){
                cout << e.what() << endl;
        }
}

------------------------------------
list支持push_front(),push_back(),pop_front(),pop_back()
list不支持'[]'和at(),因为它不是连续存放的.
标准模板库里比大小都用<,比等于用==
c1.splice(pos,c2)//转移,就是挪走了
c1.splice(pos,c2,it)//把c2中it位置的元素转移到c1的pos处
c1.splice(pos,c2,区间)//把c2里的区间转移到c1的pos
c1.merge(c2)//自动归并排序到合适的位置
remove(val)//删除指定值的元素

//list.cc
#include <iostream>
using namespace std;
#include <list>

int main()
{
        int cpp[5] = {3,5,6,8,9};
        int java[8] = {1,2,3,4,5,6,7,8};
        int Unix[4] = {3,4,5,6};
        list<int> li;
        li.insert(li.begin(),cpp,cpp+5);
        li.insert(li.begin(),java,java+8);
        li.insert(li.begin(),unix,unix+4);
        li.sort();//排序
        li.unique();//删除相邻的重复的元素,只留一份
        list<int>::iterator it = li.begin();
        while(it!=li.end())
                cout << *it++ << ' ';
        cout << endl;
}

---------------------------------
deque []  .at()
deque.push_front(val);
deque.pop_front();

---------------------------------
  + 关联式
关联式迭代器的共性:
- 插入不用指定位置:insert(val),会自动排序
- 查找一个指定的数据:find(val)返回指向元素的迭代器
  如未找到会返回end()无效迭代器
multimap,multiset有一个统计函数:count(val)//返回val的个数
以下两个函数只对允许重复才会有意义
ib = lower_bound(val)//返回val在容器中的第一个位置
ie = upper_bound(val)//返回val在容器中的最后一个位置的下一个位置
while(ib!=ie)
cout << *ib++;
还有一些人喜欢另一种方式:equal_range(val)//返回一个pair<迭,迭>

重复   元素    不同点
-----------------------------------------------------
map   N    pair<key,value>    支持[key]
multimap   Y    pair<key,value>      N
set   N key     N
multiset   Y key     N
-----------------------------------------------------
//map.cc
#include <iostream>
#include <map>
using namespace std;
#include <string>

int main()
{
	map<int, string> m;
	m.insert(make_pair(1001,"李明"));
	m.insert(make_pair(1002,"王国"));
	m.insert(make_pair(1005,"失小"));
	m[1006] = "刘华";
	m.insert(make_pair(1001,"娜娜"));
	map::iterator it;
	it = m.begin();
	while(it!=it.end()){
		cout << it->first << ':' << it->second << endl;
		++ it;//会比it++性能高
	}
}

对于set,map来说重复的插入被忽略.

//multimap
//一切操作都是对key而言的
//key一定要支持小于运算符,不然是不能进行排序的
#include <iostream>
using namespace std;
#include <map>
#include <string>

int main()
{
        typedef multimap<string,string> M;
        M mss;
        M::iterator ib,ie;
        mss.insert(make_pair("a","b"));
        mss.insert(make_pair("c","d"));
        mss.insert(make_pair("e","f"));
        mss.insert(make_pair("c","p"));
        mss.insert(make_pair("a","m"));
        mss.insert(make_pair("c","d"));
        mss.insert(make_pair("a","p"));
        ib = mss.begin();
        ie = mss.end();
        while(ib!=ie){
                cout << ib->first <<',' << ib->second << endl;
                ++ ib;
        }//end while
        cout << "a count : " << mss.count("a") << endl;
        cout << "c count : " << mss.count("c") << endl;
        ib = mss.lower_bound("c");
        ie = mss.upper_bound("c");
        while(ib!=ie){
                cout << ib->first <<',' << ib->second << endl;
                ++ ib;
        }//end while

}//end main

//set
//同样的插入同样被忽略
#include <iostream>
using namespace std;
#include <set>

int main()
{
        set<int> si;
        int userid[5] = {1,3,3,4,5};
        for(int i=0;i<5; i++)
                si.insert(userid[i]);
        set<int>::iterator it;
        it = si.begin();
        while(it!=si.end())
                cout << *it++ << ' ';
        cout << endl;
        cout << "user 3 : " << (si.find(3)!=si.end()) << endl;
        cout << "user 9 : " << (si.find(9)!=si.end()) << endl;
}

//multiset
//用的是平衡二叉树,所以它的查找效率是相当高的.
#include <iostream>
using namespace std;
#include <set>

template<typename Iter>
void show(Iter ib, Iter ie)
{
        while(ib!=ie)
                cout << *ib++ << ' ';
        cout << endl;
}
int main()
{
        int a[5] = {5,1,7,5,1};
        multiset<int> pids(a,a+5);
        show(pids.begin(),pids.end());
        pids.insert(7);
        pids.insert(7);
        pids.insert(7);
        pids.erase(pids.find(5));
        show(pids.begin(),pids.end());
        cout << "end process 7..." << endl;
        pids.erase(7);
        show(pids.begin(),pids.end());
}//end main

=================================================
* STL Algorithms

  + 几乎所用的算法都工作在某个区间
  + Search:for_each(beg,end,fun),find(beg,end,data),find_first_of

(),find_end()...
  + Sort:sort(),reverse()...
  + Copy:copy(),copy_backward()...
  + Modify:replace(beg,end,oldv,newv),merge(),remove()/*假删除,与erase()

一起用来实现真正的删除*/,c.erase(remove(...),c.end());//都这么用
  + Numeric:min(,max(),count(),swap(),accumulate()


容器适配器
  + stack<类型>(push,pop,size,empty,clear,top)
  + queue<类型>(push,pop,size,empty,clear,front,back)
  + priority_queue<类型>(优先队列)
0
0
分享到:
评论

相关推荐

    c++容器无关迭代器

    用来正向或者逆向迭代各种stl兼容的容器和标准数组的迭代器; 方便实现部分容器无关代码; 面向对象风格迭代器 原帖: http://blog.csdn.net/CDScan/archive/2010/04/01/5441640.aspx

    C++学习篇——C++ STL中迭代器介绍

    C++ STL中迭代器介绍 迭代器 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器不仅仅是指针,因此你不能认为他们一定...

    C++容器、迭代器

    1. 概论 2. 模板机制的介绍 3. STL中的基本概念 4. 容器概述 5. 迭代器 6. 算法简介

    C++_Iterator_迭代器_介绍

    迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。...因为迭代器对所有的容器都适用,现代 C++ 程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作的vector 类型也是这样。

    C++课程小作业-STL容器与迭代器的实现路径-设计类vector容器myVector

    STL是高效的C++程序库,是大量类模板和函数模板的聚集,主要的组成部分包括容器、迭代器、算法、函数等。其中容器是存放对象的集合,使用类模板方式; 选代器是容器与算法的粘合剂,是所谓的泛型指针, 使用类模板方式...

    C/C++迭代器使用具体解释

    每一个标准库容器类型都定义了一个名为 iterator 的成员,这里的 iterator 与迭代器实际类型的含义同样。  begin 和 end 操作  每种容器都定义了一对命名为 begin 和 end 的函数,用于返回迭代器。假设容器中有...

    容器通用算法和迭代器

    STL标准化了容器的使用方法,所以可以使用通用的算法和迭代器来操作容器,这里总结下常用的容器算法和迭代器用法。

    浅谈c++ stl迭代器失效的问题

    之前看《C++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。 1 莫名其妙的Erase 最初我的程序是酱紫的,别说话,我知道这样是有问题的...

    详解C++中的vector容器及用迭代器访问vector的方法

    使用迭代器iterator可以更方便地解引用和访问成员,当然也包括vector中的元素,本文就来详解C++中的vector容器及用迭代器访问vector的方法,需要的朋友可以参考下

    C++98、C++03、C++11、C++14、C++17、C++20的CHM查询文档

    内容包含:C++11 ...迭代器库 范围库 (C++20) 算法库 数值库 输入/输出库 文件系统库 本地化库 正则表达式库 原子操作库 线程支持库 实验性 C++ 特性 有用的资源 索引 std 符号索引 协程支持 (C++20) C++ 关键词

    C++STL实验报告-迭代器和非变异算法

    本实验主要练习容器set、multiset、map、multimap的使用方法,插入迭代器、反向迭代器的用法,以及四种非变异算法的基本用法。 实验器材: VScode 实验内容: 一.回顾以上四种容器相关的例题(不作为实验报告内容)...

    C++设计模式之迭代器模式(Iterator)

    迭代器在STL运用广泛,类似容器的迭代已经成为其重要特性,而迭代器模式则是利用迭代器概念进行的抽象运用,迭代器模式运用广泛和有用,因为其能够不考虑数据的存储方式,而是直接面对数据进行迭代,也就是说我们...

    插入排序的C++实现

    用C++实现的插入排序算法,其中并没有使用数组,而是使用了vector容器和迭代器。

    C++迭代器介绍(iterator、const_iterator、reverse_interator、const_reverse_interator)

    迭代器定义后,并不属于某一实例容器对象,只要是属于该迭代器类型的容器类型都可用 迭代器的分类 C++的STL定义了5种迭代器 输入迭代器:提供了对其指向元素的只读操作以及前++和后++操作符 输出迭代器:提供了...

    谷歌 B-Tree C++ 模板库.

    谷歌开源团队同时也表示,C++ B-tree容器也不是没有缺点,与标准STL容器不同的是,修改C++ B-tree容器,会令所有未在该容器中的迭代器失效。出于这个原因,谷歌在该库中还增加了一个“安全”容器版本,安全容器中的...

    c++ 自己动手实现STL容器之array

    c++ 自己动手实现STL容器之array,本资源参考侯捷STL源码剖析一书,实现了STL容器、迭代器和内存管理等功能

    [pdf格式]标准模板库自修教程与参考手册-STL进行C++编程(第二版)

    本书内容分为3部分:第1部分是STL的入门知识,介绍了STL组件,STL与其他软件库的区别,迭代器的概念,STL类属算法,序列容器,有序关联容器,函数对象及容器、迭代器和函数适配器:第2部分是综合运用篇,其中给出了...

    C++标准模板库编程实战.pdf.zip

    我们将学习如何使用容器、迭代器,以及如何定义、创建和应用算法。此外,还将学习函数对象和适配器,以及它们的用法。 阅读完本书之后,你将能够了解如何扩展STL,如何定义自定义类型的C++组件,你还将能够定义既...

    C++标准程序库

    更明确地说,这本书将焦点放在标准模板库身上,检验其中的容器、迭代器、仿函数和算法。读者还可以找到特殊容、字串、数值类别、国际化议题、IOStream。每一个元素都有深刻的呈现,包括其介绍、设计、运用实例、细部...

    C++标准库 第1版

    更明确地说,《C++标准程序库:自修教程与参考手册》将焦点放在标准模板库身上,检验其中的容器、迭代器、仿函数和算法。你还可以找到特殊容、字串、数值类别、国际化议题、IOStream。每一个元素都有深刻的呈现,包括...

Global site tag (gtag.js) - Google Analytics