- 浏览: 324386 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
huangyunbin:
swc.advance(); 这个什么时候被调用是最核心的 ...
滑动窗口计数java实现 -
80后的童年2:
深入浅出MongoDB应用实战开发网盘地址:https://p ...
MongoDB 从入门到精通专题教程 -
rryymmoK:
深入浅出MongoDB应用实战开发下载地址:http://pa ...
MongoDB 从入门到精通专题教程 -
u012352249:
怎么支持多个窗口啊?
滑动窗口计数java实现 -
rryymmoK:
深入浅出MongoDB应用实战开发百度网盘下载:链接:http ...
MongoDB 从入门到精通专题教程
* 容器的迭代器还有几种:
+ iterator:正常迭代器(常用)
+ reverse_iterator:反向迭代器(有时也用)
- rbegin(),rend()//返回反向迭代器
+ const_iterator:常量迭代器
+ const_reverse_iterator:
--------------------------------
所有的容器在插入数据时会自动加长,程序员不必关心空间问题.
容器的分类:
+ (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
------------------------------------
list支持push_front(),push_back(),pop_front(),pop_back()
list不支持'[]'和at(),因为它不是连续存放的.
标准模板库里比大小都用<,比等于用==
---------------------------------
---------------------------------
+ 关联式
关联式迭代器的共性:
- 插入不用指定位置: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
-----------------------------------------------------
=================================================
* 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<类型>(优先队列)
+ 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<类型>(优先队列)
发表评论
-
UC++之目录和文件操作
2009-06-05 11:55 1324* UC + 文件系统 - 目 ... -
用c++实现二叉树增删改查和快速排序算法
2009-06-02 13:18 2680//快速排序 #include <iostream ... -
快速排序完整示例
2009-06-01 21:04 1118#include <iostream> usin ... -
c++排序算法与模板和STL
2009-05-31 13:32 1856* 冒泡排序 一轮比较所有相邻数据对,如果顺序不合适就交换, ... -
C++算法与二叉树的实现
2009-05-30 18:35 2552* 输出格式控制 + 成员函数:width fill pr ... -
c++链表 异常 内部类 输出格式控制
2009-05-29 21:36 1736C(控制台) F(文件) ------------- ... -
C++之I/O
2009-05-27 21:26 1898* 重载 + 拷贝构造函数A(const A& o ... -
C++拷贝构造函数与运算符重载
2009-05-26 20:32 2473拷贝构造函数与运算符的重载 * 多态 - 前堤:继承,虚函 ... -
C++多态与类型转换
2009-05-25 17:10 1905c++中字符串的处理,用string进行处理,实际上它是一个类 ... -
类的继承
2009-05-24 09:42 10211,如何定义,实现一个类 ... -
面向对象编程
2009-05-23 19:20 746//倒计时 #include <iostr ... -
C++ 面向对象
2009-05-23 15:40 966* 指针简单总结 //接受命令行参数的函数 int main ... -
C与C++中的time相关函数
2009-05-23 14:03 1333本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所 ... -
c++指针续
2009-05-23 11:16 989//常指针,或叫定指针:指 ... -
C++指针
2009-05-22 19:22 1206C++ 里有字符串类型string ,最大可支持1G,可用st ... -
数组本质
2009-05-21 18:52 1244数组是一片连续的内存空间,定义时一般指明大小和类型,这样编译器 ... -
C++用递归解决汉诺塔问题(续)
2009-05-19 12:16 971#include <iostream.h> ... -
c++ 递归实例二
2009-05-18 22:37 1702#include <iostream.h> ... -
C++用递归解决汉诺塔问题
2009-05-18 21:54 2576递归确实是一个不错的算法,可以将原来很复杂的问题简化.这里要注 ... -
C++ 入门
2009-05-15 21:31 0一次性修改LINUX环境变量:(bash)export $PA ...
相关推荐
用来正向或者逆向迭代各种stl兼容的容器和标准数组的迭代器; 方便实现部分容器无关代码; 面向对象风格迭代器 原帖: http://blog.csdn.net/CDScan/archive/2010/04/01/5441640.aspx
C++ STL中迭代器介绍 迭代器 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器不仅仅是指针,因此你不能认为他们一定...
1. 概论 2. 模板机制的介绍 3. STL中的基本概念 4. 容器概述 5. 迭代器 6. 算法简介
在C++标准库中,许多容器(如`std::vector`, `std::list`, `std::set`等)都提供了内置的迭代器支持,遵循STL(Standard Template Library)的迭代器概念。这些迭代器符合C++的输入/输出迭代器、向前迭代器、双向...
3. **迭代器的生命周期**:迭代器是与特定容器实例关联的,当容器被销毁或重新分配,所有关联的迭代器都将失效。因此,确保迭代器的生命周期不超过其指向的容器是很重要的。 4. **迭代器的复制和赋值**:迭代器可以...
与普通的指针不同的是,迭代器不仅可以指向单个元素,还可以用来遍历整个容器中的所有元素。这使得迭代器成为了一种非常强大的工具,尤其是在处理大量数据时。 #### 基本概念解析 在C++ STL中,迭代器被设计成了一...
通过上述介绍可以看出,迭代器是STL中实现算法与容器分离的关键技术。它提供了一种通用的方法来访问容器中的元素,而无需关心容器的具体实现细节。理解和掌握迭代器的工作原理对于有效利用STL提供的强大功能至关重要...
STL是高效的C++程序库,是大量类模板和函数模板的聚集,主要的组成部分包括容器、迭代器、算法、函数等。其中容器是存放对象的集合,使用类模板方式; 选代器是容器与算法的粘合剂,是所谓的泛型指针, 使用类模板方式...
与使用下标来访问容器元素相比,迭代器具有更广泛的适用性。 ##### 1.1 容器的iterator类型 每种容器类型都定义了自己的迭代器类型。例如,在`vector`中,可以通过如下方式定义一个迭代器: ```cpp vector<int>::...
迭代器的类型通常与所关联的容器类型相对应,每个容器都有自己的迭代器类型。迭代器提供了以下基本操作: 1. **赋值**:将一个迭代器的值复制给另一个迭代器。 2. **比较**:比较两个迭代器是否指向容器中的同一个...
4. 容器与迭代器: 每种容器类型(如`std::vector`、`std::list`等)都有自己的迭代器类型。例如,`std::vector<int>::iterator iter;`定义了一个名为`iter`的迭代器,它可以遍历`std::vector<int>`中的元素。每个...
在C++中,迭代器是一种特殊的指针,它可以用来遍历容器中的元素,如`vector`、`list`或`map`等。迭代器提供了一种抽象的方式来访问容器内的元素,而无需暴露底层的实现细节。 当`vector`的迭代器失效时,意味着之前...
C++的迭代器是STL(Standard Template Library,标准模板库)中不可或缺的一部分,它扮演着访问和遍历容器中元素的关键角色。迭代器的概念源于对遍历线性容器(如数组、链表等)工具的抽象,允许程序员以统一的方式...
容器、算法和迭代器是STL的三大核心组件,其中容器是用来存储数据的结构,算法是处理这些数据的方法,而迭代器则是连接容器与算法的桥梁。 容器是STL中最基础的概念,它们提供了不同类型的集合,如数组、列表、向量...
### 迭代器与容器的适用性 不同的容器支持不同类型的迭代器。例如,顺序容器(如vector、deque、list)通常支持随机访问或双向迭代器;关联容器(如set、multiset、map、multimap)通常只支持双向迭代器;而容器...
在C++中,迭代器模式通常与STL(Standard Template Library)中的容器和迭代器一起使用。 源码实现迭代器模式时,通常包含以下几个关键部分: 1. **聚合类(Aggregate)**:这是包含一组元素的对象,可以是数组、...
通过本文的介绍,我们了解了 C++ 中 `vector` 容器的基本特性和用法,以及如何使用迭代器来遍历容器中的元素。此外,我们也简要介绍了队列的概念及其在 C++ 标准库中的实现方式。掌握这些基础知识对于深入学习 C++ ...
### 数据结构中的模板与迭代器 #### 模板基础 在C++中,**模板**是一种强大的工具,它允许程序员编写泛化的代码——代码不是针对一个具体的类型,而是对一组类型进行操作。模板分为**函数模板**和**类模板**。 - ...