目录
一、C++11简介
二、列表初始化
1.{} 初始化
2.std::initializer_list
三、变量类型推导
1.auto
2.decltype
3.nullptr
四、新增加容器---静态数组array、forward_list以及unordered系列
1.静态数组 array
2.单链表 forward_list
3.unordered_map
4.unordered_set
一、C++11简介
C++11官网
二、列表初始化
1.{} 初始化
在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。比如:
struct Point
{int _x;int _y;
};int main()
{int array1[] = { 1, 2, 3, 4, 5 };int array2[5] = { 0 };Point p = { 1, 2 };return 0;
}
struct Point
{int _x;int _y;
};
int main()
{int x1 = 1;int x2{ 2 };int array1[]{ 1, 2, 3, 4, 5 };int array2[5]{ 0 };Point p{ 1, 2 };// C++11中列表初始化也可以适用于new表达式中int* pa = new int[4] { 0,1,2,3 };return 0;
}
class Date
{
public:Date(int year, int month, int day):_year(year), _month(month), _day(day){cout << "Date(int year, int month, int day)" << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2022, 1, 1); // old style// C++11支持的列表初始化,这里会调用构造函数初始化Date d2{ 2022, 1, 2 };Date d3 = { 2022, 1, 3 };return 0;
}
2.std::initializer_list
std::initializer_list的介绍文档:
http://www.cplusplus.com/reference/initializer_list/initializer_list/
std::initializer_list是什么类型:
int main()
{// the type of il is an initializer_list<int> auto il = { 10, 20, 30 };cout << typeid(il).name() << endl;return 0;
}
此类型的对象由编译器根据初始化列表声明自动构造,该声明是用大括号括起来的逗号分隔元素的列表
该类型内部由两个指针构成,_First指向第一个元素的地址,_Last指向最后一个元素后一个位置的地址
initializer_list内部实现了迭代器,可以用范围for打印initializer_list
三、变量类型推导
1.auto
int main()
{int i = 10;auto p = &i;cout << typeid(p).name() << endl;map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };//map<string, string>::iterator it = dict.begin();auto it = dict.begin();return 0;
}
2.decltype
// decltype的一些使用使用场景
template<class T1, class T2>
void F(T1 t1, T2 t2)
{decltype(t1 * t2) ret;//ret的类型是intcout << typeid(ret).name() << endl;
}
int main()
{const int x = 1;double y = 2.2;decltype(x * y) ret; // ret的类型是doubledecltype(&x) p;// p的类型是int*cout << typeid(ret).name() << endl;cout << typeid(p).name() << endl;F(1, 'a');return 0;
}
3.nullptr
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
四、新增加容器---静态数组array、forward_list以及unordered系列
1.静态数组 array
array文档
C++设计这个容器对标的是C语言的静态数组,但是因为C++的动态数组vector完全可以代替array,所以array这个容器设计的意义并不大
int main()
{array<int,10> a1;vector<int> a2(10);return 0;
}
2.单链表 forward_list
forward_list文档
forward_list为单链表,里面只实现了尾插和尾删,没list好用,感兴趣可以阅读文档进行学习。
3.unordered_map
unordered_map文档
1. unordered_map 是存储 <key, value> 键值对的关联式容器,其允许通过 keys 快速的索引到与其对应的 value 。2. 在 unordered_map 中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。3. 在内部 ,unordered_map 没有对 <kye, value> 按照任何特定的顺序排序 , 为了能在常数范围内找到 key 所对应的 value , unordered_map 将相同哈希值的键值对放在相同的桶中。4. unordered_map 容器通过 key 访问单个元素要比 map 快,但它通常在遍历元素子集的范围迭代方面效率较低。5. unordered_maps 实现了直接访问操作符 (operator[]) ,它允许使用 key 作为参数直接访问value 。6. 它的迭代器至少是前向迭代器。
接口说明:
1) unordered_map的构造
函数声明 | 功能介绍 |
unordered_map | 构造不同格式的 unordered_map 对象 |
2) unordered_map的容量
函数声明 | 功能介绍 |
bool empty() const | 检测 unordered_map 是否为空 |
size_t size() const | 获取 unordered_map 的有效元素个数 |
函数声明 | 功能介绍 |
begin | 返回 unordered_map 第一个元素的迭代器 |
end | 返回 unordered_map 最后一个元素下一个位置的迭代器 |
cbegin | 返回 unordered_map 第一个元素的 const 迭代器 |
cend | 返回 unordered_map 最后一个元素下一个位置的 const 迭代器 |
4)unordered_map的元素访问
函数声明 | 功能介绍 |
operator[] | 返回与 key 对应的 value ,没有返回一个默认值 |
函数声明 | 功能介绍 |
iterator find(const K& key) | 返回 key 在哈希桶中的位置 |
size_t count(const K& key) | 返回哈希桶中关键码为 key 的键值对的个数 |
函数声明 | 功能介绍 |
insert | 向容器中插入键值对 |
erase | 删除容器中的键值对 |
void clear() | 清空容器中有效元素个数 |
void swap(unordered map&) | 交换两个容器中的元素 |
函数声明 | 功能介绍 |
size_t bucket count()const | 返回哈希桶中桶的总个数 |
size_t bucket size(size_t n)const | 返回 n 号桶中有效元素的总个数 |
size_t bucket(const K& key) | 返回元素 key 所在的桶号 |
4.unordered_set
参见文档:unordered_set文档
unordered_map和unordered_set查找效率高的原因是因为其底层是由哈希表构建的,我们之前对哈希表有过讲解,大家感兴趣看去进我主页学习,之后我会继续对C++11的其他内容进行讲解,这篇博客先到此结束。