标签:c++ 一个 方式 printf 地址 amp 适配 避免 类型
vector
:向量,动态的连续数组deque
:双端队列list
:双链表stack
:栈,适配一个容器以提供栈(LIFO
数据结构)queue
:队列,适配一个容器以提供队列(FIFO
数据结构)priority_queue
:优先队列,适配一个容器以提供优先级队列O(log n)
复杂度)的数据结构。
set
:集合,唯一键的集合,按照键排序multiset
:键的集合,按照键排序map
:键值对的集合,按照键排序,键是唯一的multimap
:键值对的集合,按照键排序vector
template < class T, class Alloc = allocator<T> > class vector;
#include<vector>
库中vector
上的常见操作复杂度如下:
vector
结尾的距离成线性 O(n)at()
函数原型:reference at (size_type pos);
返回位于指定位置 pos
的元素的引用,有边界检查。
若 pos
不在容器范围内,则抛出 std::out_of_range
类型的异常。
eg:
for(int i=0;i<10;++i)
a.push_back(i);//vector容器a从尾端加入0~9
for(int i=0;i<10;++i){//如果超出范围会报"out_of_range"错误
a.at(i)+=10;//因为是引用,所以修改后原始值发生变化
printf("%d ",a.at(i));
}
operator[]
函数原型:reference operator[]( size_type pos );
返回位于指定位置 pos
的元素的引用。不进行边界检查。
eg:
for(int i=0;i<10;++i)
a.push_back(i);//vector容器a从尾端加入0~9
for(int i=0;i<=10;++i){//如果超出范围不会报错
a[i]+=10;//因为是引用,所以修改后原始值发生变化
printf("%d ",a[i]);
}
front()
reference front();
front
的调用是未定义的。back()
reference back();
back
的调用是未定义的。iterator :迭代器
迭代器(iterator
)有时又称游标(cursor
)是程序设计的软件设计模式,可在容器上遍访的接口,设计人员无需关心容器的内容。
迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素。
每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象
迭代器提供一些基本操作符:*、++、==、!=、=
。
迭代器按照定义方式分成以下四种。
::iterator
迭代器名;::const_iterator
迭代器名;::reverse_iterator
迭代器名;::const_reverse_iterator
迭代器名;eg:
++
操作。反向迭代器和正向迭代器的区别在于:
++
操作时,迭代器会指向容器中的后一个元素;++
操作时,迭代器会指向容器中的前一个元素。std::vector<int> v; //v是存放int类型变量的可变长数组,开始时没有元素
for (int i = 0; i<5; ++i)
v.push_back(i); //push_back成员函数在vector容器尾部添加一个元素
std::vector<int>::iterator it; //定义正向迭代器
for (it = v.begin(); it != v.end(); ++it) { //用迭代器遍历容器
printf("%d ",*it);//*it 就是迭代器it指向的元素
*it *= 2; //每个元素变为原来的2倍
}
std::vector<int>::reverse_iterator it;//定义反向迭代器
for ( it = v.rbegin(); it != v.rend(); ++it)
printf("%d ",*it);
begin()
iterator begin();
end()
iterator end();
rbegin()
reverse_iterator rbegin();
rend()
reverse_iterator rend();
empty()
bool empty() const;
begin() == end()
。size()
size_type size() const;
std::distance(begin(), end())
。void reserve( size_type new_cap );
vector
的容量到大于或等于 new_cap
的值。若 new_cap
大于当前的 capacity()
,则分配新存储,否则该方法不做任何事。reserve()
不更改 vector
的 size
。new_cap
大于 capacity()
,则所有迭代器,包含尾后迭代器和所有到元素的引用都被非法化。否则,没有迭代器或引用被非法化。reserve()
减少容器容量。reserve()
能避免不必要的分配,但不适当地使用 reserve()
可能会实际增加重分配的数量size_type capacity() const;
void clear();
size()
返回零。vector
的 capacity()
不变函数原型:
iterator insert( iterator pos, const T& value );
pos
前插入 value
。
void insert( iterator pos, size_type count, const T& value );
pos
前插入 value
的 count
个副本。void insert( iterator pos, InputIt first, InputIt last);
pos
前插入来自范围 [first, last)
的元素。iterator erase( iterator pos );
//移除位于 pos
的元素。iterator erase( iterator first, iterator last );
//移除范围 [first; last)
中的元素。
end()
迭代器将失效。pos
必须合法且可解引用。从而不能以 end()
迭代器(合法,但不可解引用)为 pos
的值。first==last
则迭代器 first
不必可解引用:擦除空范围是无操作。pos
指代最后元素,则返回 end() 迭代器。void push_back( const T& value );
value
size()
大于容器capacity()
,则重新分配内存。size()
大于容器capacity()
,则所有迭代器和引用都被非法化。void pop_back();
pop_back
是未定义的void resize (size_type count, value_type val = value_type());
count
。count
小于等于容器size
,则只调整size
map
容器是关联容器的一种。在关联容器中,对象的位置取决于和它关联的键的值。键可以是基本类型,也可以是类类型。关联容器是与非关联容器(顺序容器)相对应的,顺序容器中元素的位置不依赖于元素的值,而是和该元素加入容器时的位置有关。关联容器的类型有下面八种:
按关键字有序保存元素
map //关联数组;保存关键字-值对
set //关键字即值,只保存关键字的容器
multimap //关键字可以重复出现的map
multiset //关键字可以重复出现的set
无序关联容器
unordered_map //用哈希函数组织的map,无序
unordered_set //用哈希函数组织的set,无序
unordered_multimap //哈希组织的map;关键字可以重复
unordered_multiset //哈希组织的set,关键字可以重复
map
容器有四种,每一种都是由类模板定义的。所有类型的 map
容器保存的都是键值对的元素。map
容器的元素是 pair<const K, T>
类型的对象,这种对象封装了一个 T
类型的对象和一个与其关联的 K
类型的键。pair
元素中的键是 const
,因为修改键会扰乱容器中元素的顺序。每种 map
容器的模板都有不同的特性:
1、map
容器:map
的底层是由红黑树实现的,红黑树的每一个结点都代表着 map
的一个元素。该数据结构具有自动排序的功能,因此 map
内部的元素都是有序的,元素在容器中的顺序是通过比较键值确定的。默认使用 less<K>
对象比较。
2、multimap
容器:与map
容器类似,区别只在于multimap
容器可以保存键值相同的元素。
3、unordered_map
容器:该容器的底层是由哈希(又名散列)函数组织实现的。元素的顺序并不是由键值决定的,而是由键值的哈希值确定的,哈希值是由哈希函数生成的一个整数。利用哈希函数,将关键字的哈希值都放在一个桶(bucket)里面,具有相同哈希值的放到同一个桶。unordered_map
内部元素的存储是无序的,也不允许有重复键值的元素,相当于java
中的HashMap
。
4、unordered_multimap
容器:也可以通过键值生成的哈希值来确定对象的位置,但是它允许有重复的元素。
map
和multimap
容器的模板都定义在map头文件中,unordered_map
和unordered_multimap
容器的模板都定义在unordered_map
头文件中中。
multi
前缀表明键值不必唯一,但是如果没有这个前缀,键值必须唯一。unordered
前缀表明容器中元素的位置是通过其键值所产生的哈希值来决定的,而不是通过比较键值决定的,即容器中的元素是无序的。如果没有这个前缀,则容器中元素是由比较键值决定的,即有序。下图展示了一个用名称作为键值 map<K, T>容器,对象是整数,用来表示年龄。
前面讲过map容器的底层是由红黑树(一种非严格意义上的平衡二叉树)实现的,元素检索的时间复杂度是O(logN),相比于顺序检索的线性时间复杂度还是很快的。
map
类模板有四个类型参数,但是一般只需要指定前两个模板参数的值。第一个是键值的类型,第二个是所保存对象的类型。我们通常所用的一种构造一个map
对象的方法是:
map<string, int> mapStudent;
当初始化一个map时,必须提供关键字类型和值类型。我们将每个关键字-值对包围在花括号中: {key,value} 来指出它们一起构成了map中的一个元素。初始化列表有两种方式:
map<string, string> authors = { {"Joyce", "James"},
{"Austen", "Jane"},
{"Dickens", "Charles"} };
或者:
map<string, int> authors { {"Joyce", "James"}, {"Austen", "Jane"}, {"Dickens", "Charles"}};
但是需要注意的是:初始化列表的方式是C++11的新特性,对版本比较早的编译器不支持这一特性。
下面列出几个常用的成员函数:
size 返回有效元素个数
max_size 返回容器支持的最大元素个数
empty 判断容器是否为空,为空是返回true,否则返回false
clear 清空map容器
insert 插入数据
erase 删除元素
9.1 简介
容器库是类模板与算法的汇集,允许程序员简单地访问常见数据结构,例如队列、链表和栈。
有三类容器——顺序容器、关联容器和无序关联容器——每种都被设计为支持不同组的操作。
顺序容器:顺序容器实现能按顺序访问的数据结构。
vector :向量,动态的连续数组
deque :双端队列
list :双链表
scount 查找某键值是否存在,若存在,返回1;不存在返回0
find 查找某键值是否存在,若存在返回指向元素的迭代器指针,不存在返回end()
map访问和查找元素的常用方法有:
=========================================================================================
operator[] 访问元素,也可以用于修改某个元素的value值;不进行下标(关键字)是否存在的检查(即如果关键字不存在,程序运行不会出错),访问到某个元素时,
如果该元素的键值不存在则直接创建该元素,返回是初始的值(比如int型的初始为0,则返回0,string初始为NULL,则返回NULL)
at 访问元素,也可以用于修改某个元素的value值;会进行下标(关键字)是否存在的检查,如果关键字不存在,则会拋出 out_of_range 异常。
=========================================================================================
利用迭代器访问元素
*****************************************************************************************
map<K, T>::iterator it;
(*it).first; // the key value (of type Key)
(*it).second; // the mapped value (of type T)
(*it); // the "element value" (of type pair<const Key,T>)
元素的键值和value值分别是迭代器的first和second属性。也可以用迭代器指针直接访问。
it->first; // same as (*it).first (the key value)
it->second; // same as (*it).second (the mapped value)
*****************************************************************************************
迭代器的成员函数:
begin 返回指向容器起始位置的迭代器(iterator)
end 返回指向容器末尾位置的迭代器
rbegin 返回指向容器起始位置的反向迭代器(reverse_iterator)
rend 返回指向容器末尾位置的反向迭代器
#########################################################################################
潜伏者
标签:c++ 一个 方式 printf 地址 amp 适配 避免 类型
原文地址:https://www.cnblogs.com/hbhszxyb/p/12232140.html