线性容器
std::array(数组)
std::array与std::vector:
与 std: :vector不同,std: : array对象的大小是固定的,
如果容器大小是固定的,那么可以优先考虑使用std: :array容器。
std::vector 是自动扩容的,当存入大量的数据后,并且对容器进行了删除操作,容器并不会自动归还被删除元素相应的内存,这时候就需要手动运行shrink_to_fit()释放这部分内存。
std::array和传统数组
使用std: :array能够让代码变得更加“现代化”,而且封装了一些操作函数,比如获取数组大小以及检查是否非空,同时还能够友好的使用标准库中的容器算法, 比如std::sort。
代码示例
#include<iostream>
#include<array>
#include<algorithm>
int main()
{
std::array<int,4> arr={1,2,3,4};
for(auto &i: arr)
{
i++;
}
std::sort(arr.begin(),arr.end(),[](int a,int b){return b<a;});
for(auto i: arr)
{
std::cout<<i<<std::endl;
}
return 0;
}
std::forward_list
需要知道的是,和std::list的双向链表的实现不同,std::forward_list 使用单向链表进行实玫提供了0(1)复杂度的元素插人,不支持快速随机访问(这也是链表的特点),也是标准库容器中唯一个不提供size()方法的容器。当不需要双向迭代时,具有比 std:: list更高的空间利用率。
无序容器:
什么是有序容器:
我们已经熟知了传统C++中的有序容器std::map/std::set,这些元素内部通过红黑树进行实现,插入和搜索的平均复杂度均为0(log(size))。在插入元素时候,会根据<操作符比较元素大小并判断元素是否相同,并选择合适的位置插人到容器中。当对这个容器中的元素进行遍历时,输出结果会按照<操作符的顺序来逐个遍历。
什么是无序容器:
而无序容器中的元素是不进行排序的,内部通过Hash表实现,插入和搜索元素的平均复杂度为O(constant),在不关心容器内部元素顺序时,能够获得显著的性能提升。
简单比较一下 std::map 和std::unordered_map:
#include <iostream>
#include <string>
#include <unordered_map>
#include <map>
int main()
{
std::unordered_map<int,std::string> u={
{1,"2"},{3,"3"},{2,"2"}
};
std::map<int,std::string> v=
{
{1,"2"},{3,"3"},{2,"2"}
};
std::cout<<"unorder_map:"<<std::endl;
for(auto i: u)
{
std::cout<<i.first<<" "<<i.second<<std::endl;
}
std::cout<<std::endl;
std::cout<<"map:"<<std::endl;
for(auto i: v)
{
std::cout<<i.first<<" "<<i.second<<std::endl;
}
}
结果:
unorder_map:
2 2
1 2
3 3map:
1 2
2 2
3 3
元组(简单介绍)
核心函数
make::tuple//构建元组
std::get//获取元组某个位置的值
std::tie//拆包
代码如下:
#include<tuple>
#include<iostream>
auto get_student(int id)
{
if(id==0)
return std::make_tuple(3.8,'A',"张三");
if(id==1)
return std::make_tuple(3.3,'c',"李四");
if(id==2)
return std::make_tuple(2.9,'d',"王五");
return std::make_tuple(0.0,'D',"null");
}
int main()
{
auto student=get_student(0);
std::cout << "ID: 0, "
<< "GPA: " << std::get<0>(student) << ", "
<< " 成绩: " << std::get<1>(student) << ", "
<< " 姓名: " << std::get<2>(student) << '\n';
double gpa;
char grade;
std::string name;
std::tie(gpa,grade,name)=get_student(1);
std::cout << "ID: 1, "
<< "GPA: " << gpa << ", "
<< " 成绩: " << grade << ", "
<< " 姓名: " << name << "\n";
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/129690.html