c++11 stl-array

#include <iostream>
#include <array>
#include <cstring>

//c++ 11

template<typename C>
void checkSize(C &c) {
    if(c.size() > 3) {
        c[3] = 10; //单线程OK,多线程可能出错
    }
    c.at(3) = 10;
}


void arrayPart() {
    //array 实际上是对c/c++语言中的原生数组进行了封装
    //namespace std {
    //template<typename T, size_t N>
    //  class array;
    //}
    
    //特点: 内存分配在栈(stack), 绝不会重写分配.随机访问元素
    std::array<int, 100> a; //不进行初始化, 只管分配内存
    std::array<int, 100> b = {}; //初始化为 0 
    //以上两者的区别.

    std::array<int, 5> obj = {1, 2, 3, 4, 5};
    std::array<int, 5> obj2 = {1}; //第一个为1, 后面不0

    //接口
    a.empty(); //never be true if size > 0
    a.size();
    a.max_size();

    //operator == < != > <= >=
    auto aa = a;
    aa.swap(a); //array的swap是交换每一个元素都需要做交换,因为它是在stack中储存的.不是通过堆来管理
    //访问元素
    a[1]; //不进行检查,越界出错
    a.at(1); //进行检查,越界抛出异常
    a.front(); //返回头部元素的引用
    a.back();  //返回最后元素的引用
    checkSize(a);

    //迭代器相关的:
    a.begin(); //可以对begin减引操作, 但不能堆end进行此操作
    a.end();
    a.cbegin(); //const 引用
    a.cend();
    
    a.rbegin(); //从尾部遍历到头部,与以上相反
    a.rend();

    a.crbegin(); //const 方式从尾部遍历到头部
    a.crend();


    //和C的接口互用
    std::array<char, 100> carr;
    strcpy(&carr[0], "hello world\n");
    printf("%s", &carr[0]); //更好的使用 carr.data();
    printf("%s", carr.data());
    //错误用法
    printf("%s", carr.begin());


    //特殊的地方
    auto info = std::get<1>(carr); //与 carr[1] 一样
    printf("%c\n", info); //
    carr.fill(0); //对所有元素赋予0

    //异常 exception
    //c.at(pos)
    //copy move swap, 进行操作时,可能触发异常

}
int main(void) {

    arrayPart();
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lyxf/p/12358418.html