vector是一种动态数组,是基本数组的类模板。其内部定义了很多基本操作。
#include
vector
vector
vector
vector
assign(beg,end) 将(beg; end)区间中的数据赋值给对象。
assign(n,elem)将n个elem的拷贝赋值给对象。
at(idx)传回索引idx所指的数据,如果idx越界,抛出out_of_range。
back()传回最后一个数据,不检查这个数据是否存在。
begin()传回迭代器中的第一个数据地址。
capacity()返回容器中数据个数。
clear()移除容器中所有数据。
empty()判断容器是否为空。
end() // 指向迭代器中末端元素的下一个,指向一个不存在元素。
erase(pos) // 删除pos位置的数据,传回下一个数据的位置。
erase(beg,end)删除[beg,end)区间的数据,传回下一个数据的位置。
front()传回第一个数据。
get_allocator使用构造函数返回一个拷贝。
insert(pos,elem) // 在pos位置插入一个elem拷贝,传回新数据位置
insert(pos,n,elem) // 在pos位置插入n个elem数据,无返回值
insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。无返回值
max_size()返回容器中最大数据的数量。
pop_back()删除最后一个数据。
push_back(elem)在尾部加入一个数据。
rbegin()传回一个逆向队列的第一个数据。
rend()传回一个逆向队列的最后一个数据的下一个位置。
resize(num)重新指定队列的长度。
reserve()保留适当的容量。
size()返回容器中实际数据的个数。
c1.swap(c2) // 将c1和c2元素互换
#include
deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。
deque
deque
deque
deque
deque
~deque
assign(beg, end) 将[beg; end)区间中的数据赋值给对象。
assign(n, elem) 将n个elem的拷贝赋值给对象。
at(index) 传回索引index所指的数据,如果index越界,抛出out_of_range。
back() 传回最后一个数据,不检查这个数据是否存在。
begin() 传回迭代器重的可一个数据。
clear() 移除容器中所有数据。
empty() 判断容器是否为空。
end() 指向迭代器中的最后一个数据地址。
erase(pos) 删除pos位置的数据,传回下一个数据的位置。
erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。
front() 传回第一个数据。
get_allocator 使用构造函数返回一个拷贝。
insert(pos,elem) 在pos位置插入一个elem拷贝,传回新数据位置
insert(pos,n,elem) 在pos位置插入>n个elem数据。无返回值
insert(pos,beg,end) 在pos位置插入在[beg,end)区间的数据。无返回值
max_size() 返回容器中最大数据的数量。
pop_back() 删除最后一个数据。
pop_front() 删除头部数据。
push_back(elem) 在尾部加入一个数据。
push_front(elem) 在头部插入一个数据。
rbegin() 传回一个逆向队列的第一个数据。
rend() 传回一个逆向队列的最后一个数据的下一个位置。
resize(num) 重新指定队列的长度。
size() 返回容器中实际数据的个数。
swap(c2)
swap(c1,c2) 将c1和c2元素互换。
list
list
list
list
list
assign() //分配值,有两个重载:
c1.assign(++c2.begin(),c2.end())//c1现在为(50,60)。
c1.assign(7,4) //c1中现在为7个4,c1(4,4,4,4,4,4,4)。
back() //返回最后一元素的引用:
begin() //返回第一个元素的指针(iterator)
clear() //删除所有元素
empty() //判断是否链表为空
end() //返回最后一个元素的下一位置的指针(list为空时end()=begin())
erase() //删除一个元素或一个区域的元素(两个重载)
front() //返回第一个元素的引用:
insert() //在指定位置插入一个或多个元素(三个重载):
max_size() //返回链表最大可能长度(size_type就是int型):
merge() //合并两个链表并使之默认升序(也可改):
pop_back() //删除链表尾的一个元素
pop_front() //删除链表头的一元素
push_back() //增加一元素到链表尾
push_front() //增加一元素到链表头
rbegin() //返回链表最后一元素的后向指针(reverse_iterator or const)
rend() //返回链表第一元素的下一位置的后向指针
remove //()删除链表中匹配值的元素(匹配元素全部删除)
remove_if() //删除条件满足的元素(会遍历一遍链表)
resize() //重新定义链表长度(两重载):
reverse() //反转链表:
size() //返回链表中元素个数
sort() //对链表排序,默认升序(可自定义)
splice() //对两个链表进行结合(三个重载)
swap() //交换两个链表(两个重载)
unique() //删除相邻重复元素(断言已经排序,因为它不会删除不相邻的相同元素)
集和多集(set 和multiset容器类)
#include
一个集合(set)是一个容器,它其中所包含的元素的值是唯一的。
set和multiset的区别是:set支持唯一键值,set中的值都是特定的,而且只出现一次;而multiset中可以出现副本键,同一值可以出现多次。
由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序.
explicit set(const Compare&=compare());
如:set
less
Template
如:set
通过指定某一预先定义的区间来初始化set对象的构造函数。
set(const set
如:set
begin() 返回指向第一个元素的迭代器
clear() 清除所有元素
count() 返回某个值元素的个数
empty() 如果集合为空,返回true
end() 返回指向最后一个元素之后的迭代器,不是最后一个元素
equal_range() 返回集合中与给定值相等的上下限的两个迭代器
erase() 删除集合中的元素
find() 返回一个指向被查找到元素的迭代器
get_allocator() 返回集合的分配器
insert() 在集合中插入元素
lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器
key_comp() 返回一个用于元素间值比较的函数
max_size() 返回集合能容纳的元素的最大限值
rbegin() 返回指向集合中最后一个元素的反向迭代器
rend() 返回指向集合中第一个元素的反向迭代器
size() 集合中元素的数目
swap() 交换两个集合变量
upper_bound() 返回大于某个值元素的迭代器
value_comp() 返回一个用于比较元素间的值的函数
映射和多重映射基于某一类型Key的键集的存在,提供对T类型的数据进行快速和高效的检索。对map而言,键只是指存储在容器中的某一成员。Map不支持副本键,multimap支持副本键。Map和multimap对象包涵了键和各个键有关的值,键和值的数据类型是不相同的,这与set不同。set中的key和value是Key类型的,而map中的key和value是一个pair结构中的两个分量。
使用map得包含map类所在的头文件:
#include
Template
map(); // 默认构造函数
map(const map& m) // 拷贝构造函数
map(iterator begin, iterator end ); //区间构造函数
map(iterator begin, iterator end, consttraits& _compare) //带比较谓词的构造函数
map(iterator begin, iterator end, consttraits& _compare, const allocator& all) //带分配器
1.2.1 map的基本定义
map对象是模板类,需要关键字和存储对象两个模板参数:
std:map
这样就定义了一个用int作为索引,并拥有相关联的指向string的指针.
为了使用方便,可以对模板类进行一下类型定义:
typedef map
UDT_MAP_INT_CSTRING enumMap; //后面会依此例说明
1.2.2 map的嵌套定义
map
map支持下标运算符operator[],用访问普通数组的方式来访问map;不过下标为map的键,在multimap中一个键可以对应多个不同的值。
三种插入方式:
2.1.1用insert方法插入pair对象:
enumMap.insert(pair
2.1.2 用insert方法插入value_type对象:
enumMap.insert(map
2.1.3 用数组方式插入值:
enumMap[1] = "One";
enumMap[2] = "Two";
......
这样非常直观,但存在一个性能的问题。插入2时,先在enumMap中查找主键为2的项,没发现,然后将一个新的对象插入enumMap,键是2,值是一个空字符串,插入完成后,将字符串赋为"Two"; 该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。用前两种方法可以避免开销。
2.2.1下标操作符给出了获得一个值的最简单方法:
CString tmp = enumMap[2];
但是,只有当map中有这个键的实例时才对,否则会自动插入一个实例,值为初始化值。
2.2.2我们可以使用find()和count()方法来发现一个键是否存在
查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.
int nFindKey = 2; //要查找的Key
//定义一个条目变量(实际是指针)
UDT_MAP_INT_CSTRING::iterator it=enumMap.find(nFindKey);
if(it == enumMap.end()) {
cout<<"没找到"<
}
else {
cout<<"找到了"<
}
通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据。
iterator->first 关键字(key)
iterator->second 存储的数据(value)
2.3.1移除某个map中某个条目用erase()
该成员方法的定义如下:
1.iterator erase(iterator it); //通过一个条目对象删除
2.iterator erase(iterator first, iterator last); //删除一个范围
3.size_type erase(const Key& key); //通过关键字删除
2.3.2清除所有的元素clear()
clear()就相当于 enumMap.erase(enumMap.begin(), enumMap.end());
map中的swap不是一个容器中的元素交换,而是两个容器交换;
For example:
#include
#include
using namespace std;
int main( )
{
map
map
m1.insert ( pair
m1.insert ( pair
m1.insert ( pair
m2.insert ( pair
m2.insert ( pair
m3.insert ( pair
cout << "The original map m1is:";
for ( m1_Iter = m1.begin( ); m1_Iter !=m1.end( ); m1_Iter++ )
cout << " " <
cout << "." << endl;
// This is the member function version ofswap
//m2 is said to be the argument map; m1 thetarget map
m1.swap( m2 );
cout << "After swapping with m2,map m1 is:";
for ( m1_Iter = m1.begin( ); m1_Iter !=m1.end( ); m1_Iter++ )
cout << " " << m1_Iter-> second;
cout << "." << endl;
cout << "After swapping with m2,map m2 is:";
for ( m1_Iter = m2.begin( ); m1_Iter !=m2.end( ); m1_Iter++ )
cout << " " << m1_Iter-> second;
cout << "." << endl;
// This is the specialized template versionof swap
swap( m1, m3 );
cout << "After swapping with m3,map m1 is:";
for ( m1_Iter = m1.begin( ); m1_Iter !=m1.end( ); m1_Iter++ )
cout << " " << m1_Iter-> second;
cout << "." << endl;
}
Map中的元素是自动按key升序排序,所以不能对map用sort函数:
For example:
#include
#include
using namespace std;
int main( )
{
map
map
m1.insert ( pair
m1.insert ( pair
m1.insert ( pair
m1.insert ( pair
m1.insert ( pair
m1.insert ( pair
cout << "The original map m1is:"<
for ( m1_Iter = m1.begin( ); m1_Iter !=m1.end( ); m1_Iter++ )
cout << m1_Iter->first<<""<
}
The original map m1 is:
1 20
2 50
3 60
4 40
6 40
7 30
请按任意键继续. . .
C++Maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
Stack(堆栈)是一个容器类的改编,为程序员提供了堆栈的全部功能,也就是说实现了一个先进后出的数据结构(FILO)。
#include
主要有一下几个函数:
empty() 如当前堆栈为空,empty()函数返回true,否则返回false.
pop() 函数移除堆栈中最顶层元素。
push() 向栈顶添加一个元素。
size() 函数返当前堆栈中的元素数目。
top() 函数返回栈顶元素的引用。
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列,遵循先进先出原则(FIFO)。
back() 返回队列最后一个元素的引用
front() 返回队列第一个元素的引用
empty() 检查队列是否为空
pop() 从队首删除一个元素
push() 从队尾插入一个元素
size() 返回队列元素的个数
优先级最高的元素最先出队
empty() 检查队列是否为空
pop() 从队首删除一个元素
push() 从队尾插入一个元素
size() 返回队列元素的个数
top() 返回队首最大元素的const引用