`
yunchow
  • 浏览: 324386 次
  • 性别: 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++标准库中,许多容器(如`std::vector`, `std::list`, `std::set`等)都提供了内置的迭代器支持,遵循STL(Standard Template Library)的迭代器概念。这些迭代器符合C++的输入/输出迭代器、向前迭代器、双向...

    c++迭代器失效问题

    3. **迭代器的生命周期**:迭代器是与特定容器实例关联的,当容器被销毁或重新分配,所有关联的迭代器都将失效。因此,确保迭代器的生命周期不超过其指向的容器是很重要的。 4. **迭代器的复制和赋值**:迭代器可以...

    C++ STL 迭代器 入门

    与普通的指针不同的是,迭代器不仅可以指向单个元素,还可以用来遍历整个容器中的所有元素。这使得迭代器成为了一种非常强大的工具,尤其是在处理大量数据时。 #### 基本概念解析 在C++ STL中,迭代器被设计成了一...

    C++ STL迭代器机制剖析.pdf

    通过上述介绍可以看出,迭代器是STL中实现算法与容器分离的关键技术。它提供了一种通用的方法来访问容器中的元素,而无需关心容器的具体实现细节。理解和掌握迭代器的工作原理对于有效利用STL提供的强大功能至关重要...

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

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

    C++迭代器简介:C++迭代器

    与使用下标来访问容器元素相比,迭代器具有更广泛的适用性。 ##### 1.1 容器的iterator类型 每种容器类型都定义了自己的迭代器类型。例如,在`vector`中,可以通过如下方式定义一个迭代器: ```cpp vector&lt;int&gt;::...

    ch16 容器和迭代器.ppt

    迭代器的类型通常与所关联的容器类型相对应,每个容器都有自己的迭代器类型。迭代器提供了以下基本操作: 1. **赋值**:将一个迭代器的值复制给另一个迭代器。 2. **比较**:比较两个迭代器是否指向容器中的同一个...

    什么是C++的迭代器.pdf

    4. 容器与迭代器: 每种容器类型(如`std::vector`、`std::list`等)都有自己的迭代器类型。例如,`std::vector&lt;int&gt;::iterator iter;`定义了一个名为`iter`的迭代器,它可以遍历`std::vector&lt;int&gt;`中的元素。每个...

    [C++][经验总结]vectory迭代器(iterator)失效

    在C++中,迭代器是一种特殊的指针,它可以用来遍历容器中的元素,如`vector`、`list`或`map`等。迭代器提供了一种抽象的方式来访问容器内的元素,而无需暴露底层的实现细节。 当`vector`的迭代器失效时,意味着之前...

    什么是C++的迭代器.docx

    C++的迭代器是STL(Standard Template Library,标准模板库)中不可或缺的一部分,它扮演着访问和遍历容器中元素的关键角色。迭代器的概念源于对遍历线性容器(如数组、链表等)工具的抽象,允许程序员以统一的方式...

    容器通用算法和迭代器

    容器、算法和迭代器是STL的三大核心组件,其中容器是用来存储数据的结构,算法是处理这些数据的方法,而迭代器则是连接容器与算法的桥梁。 容器是STL中最基础的概念,它们提供了不同类型的集合,如数组、列表、向量...

    STL之迭代器 迭代器的用法,分类,案例分析

    ### 迭代器与容器的适用性 不同的容器支持不同类型的迭代器。例如,顺序容器(如vector、deque、list)通常支持随机访问或双向迭代器;关联容器(如set、multiset、map、multimap)通常只支持双向迭代器;而容器...

    C++迭代器模式个人源码实现及参考代码

    在C++中,迭代器模式通常与STL(Standard Template Library)中的容器和迭代器一起使用。 源码实现迭代器模式时,通常包含以下几个关键部分: 1. **聚合类(Aggregate)**:这是包含一组元素的对象,可以是数组、...

    C++容器与队列

    通过本文的介绍,我们了解了 C++ 中 `vector` 容器的基本特性和用法,以及如何使用迭代器来遍历容器中的元素。此外,我们也简要介绍了队列的概念及其在 C++ 标准库中的实现方式。掌握这些基础知识对于深入学习 C++ ...

    数据结构 模板与迭代器

    ### 数据结构中的模板与迭代器 #### 模板基础 在C++中,**模板**是一种强大的工具,它允许程序员编写泛化的代码——代码不是针对一个具体的类型,而是对一组类型进行操作。模板分为**函数模板**和**类模板**。 - ...

Global site tag (gtag.js) - Google Analytics