c++新特性 之容器

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 c++新特性 之容器,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

线性容器

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 3

map:
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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!