c++11相關特性


前言

  • 發現好多情況下都會用到c++11的新特性啊。
  • 所以稍稍總結一下,只會粗略的說,不會詳細的講……
  • upd.csp-s可能不是c++11標准,請慎用。(博主考試CE后的善意提醒)

1.auto&decltype

  • c++11新增關鍵字,類型推導。
  • 迭代器在之前必須寫得很長,比如:
set<int>s;
set<int>::iterator it=s.begin();
  • 而c++11只需寫成:
auto it=s.begin();
  •  但auto只能對變量而不能對表達式進行類型推導,所以又引入了decltype關鍵字。
  • decltype只會推導表達式的類型而不會算出數值。
auto a=233,b=666;
decltype (a+b) c;

2.constexpr

  • 常量表達式的修飾符。
  • 可修飾常量和函數。
  • 注意賦給常量的值必須是系統能夠識別的,而不能是自定義的變量。
#include<bits/stdc++.h>
constexpr long long qwq(long long x){
    return x*x;
}
int main(){
    constexpr int a=1;
    return 0;
}
View Code

3.nullptr

  • 空指針值,為了區分0和NULL。
  • 因為NULL的本質是0,所以就算把NULL賦給int也不會報錯,但nullptr就不行,因為它只代表空指針。

4.tuple

  • 元組。
  • 相當於高級的pair,成員可為任意個。
  • 相關操作參考下面的代碼。
#include<iostream>
#include<tuple>
using namespace std;
tuple<int,int,int>s=make_tuple(1,2,3);//make_tuple:制造元組
int main(){
    cout<<get<0>(s)<<" "<<get<1>(s)<<" "<<get<2>(s)<<endl;//get:得到元組中的某位元素
    int x,y,z;
    tie(x,y,z)=s;//tie:拆元組
    cout<<x<<" "<<y<<" "<<z<<endl;
    tuple<int,long long>w=make_tuple(5,4ll);
    auto ws=tuple_cat(w,s);//tuple_cat:合並元組
    cout<<get<0>(ws)<<" "<<get<1>(ws)<<" "<<get<2>(ws)<<" "<<get<3>(ws)<<" "<<get<4>(ws)<<endl;
    return 0;
}
View Code

5.哈希容器

  • c++11新增了一些基於Hash的容器:
  • unorder_map,unorder_set,unorder_mulitmap,unorder_mulitset。
  • 性能比set,map等更優。

6.容器&數組遍歷

  • 只能說非常方便,甚至可以遍歷map……
#include<bits/stdc++.h>
using namespace std;
vector<int>s;
int a[3];
int main(){
    a[0]=233,a[1]=666,a[2]=555;
    s.push_back(19240817),s.push_back(1e9+7),s.push_back(998244353);
    for(auto &x:s)cout<<x<<" ";
    puts("");
    for(int &x:a)cout<<x<<" ";
    puts("");
    return 0;
}
View Code

7.容器初始化

  • 可以像數組一樣對容器進行初始化,包括map(為什么又拿map開刀……)。
map<int,int>mp{{233,1},{521,2}};

8.Lambda

  • 匿名函數。
  • 可以在使用時再定義函數,而不用費力起函數名。
  • 如sort:
#include<bits/stdc++.h>
using namespace std;
int a[101];
int main(){
    srand(time(0));
    int n=100;
    for(register int i=1;i<=n;++i)a[i]=rand();
    sort(a+1,a+n+1,[](int skyh,int yxs){
        return skyh>yxs;
    });
    for(register int i=1;i<=n;++i)printf("%d ",a[i]);
    return 0;
}
View Code
  • 用法很靈活,非常好的特性。然而我對它理解不是非常透徹

9.mt19937

  • C++11引入,基於Mersenne twister算法實現的高質量隨機數。
  • 得到的隨機數在int范圍內。
  • 據說比rand()函數快,不過實測時mt19937比rand還要慢一些……
  • 還是rand更快。
#include<random> #include<cstdio>
using namespace std; int main(){ //freopen("1.in","w",stdout);
 mt19937 rd(time(NULL)); int n=rd()%5+5,m=rd()%5+5; printf("%d %d\n",n,m); return 0; }
View Code
  • upd.聽從miemeng神的意見,順便提一下random標准庫吧。
  • 這是c++11新增的一個庫,分為生成器和分布兩大部分。
  • 其中有三種隨機數生成引擎。
  • 第一種是線性同余生成引擎,第二種是Mersenne_twister算法(梅森旋轉法)生成引擎,第三種是滯后Fibonacci算法生成引擎。
  • 線性同余最快,梅森旋轉法效果最好。
  • 想更詳細了解的話可以參照這篇博客:
  • https://blog.csdn.net/u010487568/article/details/51526337

10.尖括號

  • 可能你在打代碼的時候沒有注意,但這也是c++11的特性。
  • >>不再只被認為是流。
vector<pair<int,int>>s;//是合法的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM