03~C++STL 迭代器与容器总结

一、独立迭代器
1、输入输出迭代器

int casts[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> dice(10);
copy(casts, casts + 10, dice.begin);

ostream_iterator<int , char> out_iter(cout, " ");

*out_iter++ = 15; //cout << 15 << " " <<endl;
//also
copy(dice.begin(),dice.end(),outer);

//输入流,读取数据到文件尾,类型不匹配或者其他输入故障为止
copy(istream_iterator<int,char>(cin), istream_iterator<int ,char>(),dice.begin());

02 插入迭代器
插入迭代器将operator=操作,转换为成员push_back 方法

#include <iostream>
#include <string>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;
void output(const std::string &s) {cout << s << " " ;}
int main(void) {
string s1[4] = {"fine","fish","fashion","fate"};
string s2[2] = {"busy","bus"};
string s3[2] = {"silly","singers"};

vector<string> words(4);
copy(s1, s1 + 4,, words.begin());
for_each(words.begin(),words.end(), output);
cout <<endl;

copy(s2,s2 +2 , back_insert_iterator<vector<string> >(words));
for_each(words.begin(),words.end(), output);
cout <<endl;


copy(s3,s3 +2 , back_insert_iterator<vector<string> >(words, words.begin()));
for_each(words.begin(),words.end(), output);
cout <<endl;

return 0;
}

二、容器与其成员迭代器
STL有7中容器类型,deque,forward_list, list, queue, priority_queue, stack, vector

序列需要支持的必要接口:n表示整数,t表示数值,i j 表示迭代器
X a(n,t) 声明一个容器a,有n个t值构成
X(n,t) ,创建一个匿名容器,有n个t值构成
X a (i,j),创建一个容器a,并将其初始化为区间[i,j)的内容
X (i,j),创建一个匿名容器,并将其初始化为区间[i,j)的内容
a.insert(p,t); 将t插入到p前面
a.insert(p,n,t); 将n个t插入到p前面
a.insert(p,i,j); 将[i,j)之间的数据插入到p之前
a.erase§;删除p指向的元素
a.erase(p,q);删除区间[p,q) 之间的元素
a.clear; 等价于a.erase(a.begin(), a.end());

进一步:
deque, list, queue, priority_queue, stack, vector 这六种容器支持:
a.front 等价 *a.begin() 适用vector list deque
a.back 等价 *–a.end(); 适用vector list deque

a.push_front(t), 等价a.insert(a.begin, t); 适用 list deque
a.push_back(t), 等价a.insert(a.end(), t); 适用 vector list deque
a.pop_front(t); 等价 a.erase(a.begin()); 适用 list deque
a.pop_back(t); 等价 a.erase(–a.end()); 适用 vector list deque
a[n] 等价*(a.begin() + n), 适用vector deque
a.at(n) 等价*(a.begin() + n), 适用vector deque

最后,容器提供的私有方法
vector :
反转迭代器 reverse_iterator
rbegin()
rend()

list:
反转迭代器
rbegin()
rend()
void merge(list<T,Alloc> & x) ; 将链表x与调用链表合并。两个链表必须已经排序。合并后的已经排序的链表保存在调用链表中,x 为空。这个函数的复杂度为线性复杂度
void remove(T const& val) ;删除链表中删除val的所有实例,这个函数为线性复杂度
void sort();使用< 运算符对链表进行排序,N个元素的复杂度为NlogN
void splice(iterator pos, list<T, Alloc>x); 将链表x的 内容插入到pos前面,x将为空。函数的复杂度为固定时间复杂度
void unique(); 将连续相同元素压缩为单个元素。这个函数的复杂度为线性复杂度

forward_list:
C++ 11 新增的容器类,它实现了单向链表。因此它只需要正向迭代器, 不需要双向迭代器。不可反转,相对于vector 更简单,更紧凑,功能也更少

queue:(默认底层使用dqueue)
bool empty();如果队列为空,返回true,否则返回false
size_type size() const; 返回队列中元素的个数
void push(T const& x); 在队尾插入x
void pop(); 删除队首元素

priority_queue(底层使用vector):
方法同queue相同,区别在于最大的元素会被放到队列首部
可以提供比较方法来确定哪一个是较大的数据,容器提供如下形式
priority_queue p1
priority_queue p1 (greater);
greater 是一个预先定义的函数对象

stack:
bool empty() const; 如果栈为空,返回true。否则返回false
size_type size() const; 返回栈中的元素个数
T& top(); 返回指向栈顶的元素的引用
void push(T const& x); 在栈的顶部压入x
void pop();删除栈顶元素

array:
C++11
它是头文件array定义的,并非STL容器,因为其长度是固定的,因此不支持push insert等操作
但定义了对它来说有意义的成员函数,比如 operator[] 和at(), 也可以吧很多标准的STL算法用于array对象,比如 copy sort for_each()等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值