码迷,mamicode.com
首页 > 编程语言 > 详细

C++11新特性之 std::array container

时间:2015-11-08 22:35:02      阅读:337      评论:0      收藏:0      [点我收藏+]

标签:

数组每个人都很熟悉,vector更是我们常常用到的。

但是某些场合,使用vector是多余的,尤其能明确元素个数的情况下,这样我们就付出了效率稍低的代价!

但是你使用数组的代价是那么的不安全,那么的不方便。

于是,C++11推出了模板类array,位于std名称控件中。
与vector不同的是,array对象的长度是固定的,使用了静态存储区,即存储在栈上,效率跟数组相同,但是更加的安全。

首先需要包含头文件array,而且语法与vector也有所不同:

#include<array>
...
std::array<int,5> ai;//创建一个有5个int成员的对象
std::array<double,4> ad = {1.2, 2.1, 3.1, 4.1};

顺便提一嘴,C++11允许使用初始化列表对vetcor和array进行赋值,详情请见博客《 c++11特性之initializer_list

个人觉得array相比于数组最大的优势就是可以将一个array对象赋值给另一个array对象:

std::array<double, 4> ad = {1.2, 2.1, 3.1, 4.1};
std::array<double, 4> ad1;
ad1 = ad;

数组索引越界也是我们往往躲不过的坑儿,array和vector使用中括号索引时也不会检查索引值的正确性。

但是,他们有一个成员函数可以替代中括号进行索引,这样越界就会进行检查:

std::array<double, 4> ad = {1.2, 2.1, 3.1, 4.1};
ad[-2] = 0.5;//合法
ad.at(1) = 1.1;

使用at(),将在运行期间捕获非法索引的,默认将程序中断。

最后上一段代码:

#include <string>
#include <iterator>
#include <iostream>
#include <algorithm>
#include <array>

int main()
{
    // construction uses aggregate initialization
    std::array<int, 5> i_array1{ {3, 4, 5, 1, 2} };  // double-braces required
    std::array<int, 5> i_array2 = {1, 2, 3, 4, 5};   // except after =
    std::array<std::string, 2> string_array = { {std::string("a"), "b"} };

    std::cout << "Initial i_array1 : ";
    for(auto i: i_array1)
        std::cout << i << ‘ ‘;
    // container operations are supported
    std::sort(i_array1.begin(), i_array1.end());

    std::cout << "\nsored i_array1 : ";
    for(auto i: i_array1)
        std::cout << i << ‘ ‘;

    std::cout << "\nInitial i_array2 : ";
    for(auto i: i_array2)
        std::cout << i << ‘ ‘;

    std::cout << "\nreversed i_array2 : ";
    std::reverse_copy(i_array2.begin(), i_array2.end(),
                      std::ostream_iterator<int>(std::cout, " "));

    // ranged for loop is supported
    std::cout << "\nstring_array : ";
    for(auto& s: string_array)
        std::cout << s << ‘ ‘;

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++11新特性之 std::array container

标签:

原文地址:http://blog.csdn.net/wangshubo1989/article/details/49722115

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!