C++ std::array
std::array
template < class T, size_t N > class array;
Code Example
#include <iostream>
#include <array>
#include <cstring>
using namespace std;
int main(int argc, char **argv)
{
array<int, 5> intArr = {1,2,3,4,5};
for(auto it = intArr.begin(); it != intArr.end(); it++ )
{
cout << *it << "\t";
}
///< output: 1 2 3 4 5
cout << "\n";
///< r means reverse
for(auto rit = intArr.rbegin(); rit < intArr.rend(); rit++)
{
cout << *rit << "\t";
}
///< output: 5 4 3 2 1
cout << "\n";
///< c means const
for(auto cit = intArr.cbegin(); cit != intArr.cend(); cit++ )
{
cout << *cit << "\t";
}
///< output:1 2 3 4 5
cout << "\n";
for(auto crit = intArr.crbegin(); crit < intArr.crend(); crit++)
{
cout << *crit << "\t";
}
///< output:5 4 3 2 1
cout << "\n";
cout << "size of array:" << intArr.size() << "\n"; ///< output: 5
cout << "sizeof array:" << sizeof intArr << "\n"; ///< output: 5
cout << "\n";
array<char, 10> arrCh = {'a','b','c','d','e'};
cout << "size of array:" << arrCh.size() << "\n"; ///< output: 10
cout << "max_size of array" << arrCh.max_size() << "\n"; ///< output: 10
cout<< "\n";
array<int, 0> first;
array<int, 5> second;
cout << "first array:" << first.empty() << "\n";
///< output: 1, means true
cout << "second array:" << second.empty() << "\n";
///< output: 0, means false
for(int i=0; i < second.size(); i++){
second[i]=i;
}
for(auto it = second.begin(); it != second.end(); it++){
cout << *it << "\t";
}
///< output: 10 11 12 13 14
for(int i=0; i < second.size(); i++){
second.at(i) = i;
}
cout << "\n";
for(int i=0; i< second.size(); i++){
cout << second.at(i) << "\t";
}
///< output:1 2 3 4 5
array<int, 3> third = {1,2,3};
for(int &x:third){
cout << x << "\t";
}
///< output:1 2 3
cout << "\n";
cout << "array::front():" << third.front() << "\n"; ///< output: 1
cout << "array::back():" << third.back() << "\n"; ///< output: 3
cout <<"modify front and back\n";
third.front() == 11;
third.back() = 22;
cout << "array::front():" << third.front() << "\n"; ///< output: 11
cout << "array::back():" << third.back() << "\n"; ///< output: 22
const char * cstr = "Hello array";
array<char, 20> arrChar;
memcpy(arrChar.data(),cstr, strlen(cstr));
cout << arrChar.data() << "\n";
///< output: Hello array
array<int,10> fourth;
fourth.fill(2);
for(int &x:fourth){
cout << x << "\t";
}
///< output: 2 2 2 2 2 2 2 2 2 2
array<int, 5> five = {1,2,3,4,5};
array<int, 5> six = {6,7,8,9,0};
five.swap(six);
cout << "\n";
for(int &x:five){
cout << x << "\t";
}
///< output: 6 7 8 9 0
cout << "\n";
for(int &x:six){
cout << x << "\t";
}
///< output:1 2 3 4 5
array<int,5> a = {1,2,3,4,5};
array<int,5> b = {1,2,3,4,5};
array<int,5> c = {5,4,3,2,1};
cout << "\n";
/** They are both true */
if( a == b ) cout << " a and b are equal!\n";
if( b!=c ) cout << "b and c are not equal!\n";
if( b < c ) cout << "b is less than c\n";
if( c > b ) cout << "c is greater than b\n";
if( a <= b ) cout << "a is less than or equal b\n";
if( a >= b ) cout << "ais greater than or equal b\n";
return 0;
}
Array class
Arrays are fixed-size sequence containers: they hold a specific number of elements ordered in a strict linear sequence.
Internally, an array does not keep any data other than the elements it contains (not even its size, which is a template parameter, fixed on compile time). It is as efficient in terms of storage size as an ordinary array declared with the language's bracket syntax ([]). This class merely adds a layer of member and global functions to it, so that arrays can be used as standard containers.
Unlike the other standard containers, arrays have a fixed size and do not manage the allocation of its elements through an allocator: they are an aggregate type encapsulating a fixed-size array of elements. Therefore,they cannot be expanded or contracted dynamically (see vector for a similar container that can be expanded).Zero-sized arrays are valid, but they should not be dereferenced (members front, back, and data).
Unlike with the other containers in the Standard Library, swapping two array containers is a linear operation that involves swapping all the elements in the ranges individually, which generally is a considerably less efficient
operation. On the other side, this allows the iterators to elements in both containers to keep their original container association.
Another unique feature of array containers is that they can be treated as tuple objects: The header overloads the get function to access the elements of the array as if it was a tuple, as well as specialized tuple_size
and tuple_element types.
Container properties
- Sequence:Elements in sequence containers are ordered in a strict linear sequence.Individual elements are accessed by their position in this sequence.
- Contiguous storage:The elements are stored in contiguous memory locations, allowing constant time random access to elements. Pointers to an element can be offset to access other elements.
- Fixed-size aggregate:The container uses implicit constructors and destructors to allocate the required space statically. Its size is compile-time constant. No memory or time overhead.
Template parameters
- T:Type of the elements contained. Aliased as member type array::value_type.
- N:Size of the array, in terms of number of elements.
In the reference for the array member functions, these same names are assumed for the template parameters.
Member types
The following aliases are member types of array. They are widely used as parameter and return types by member functions:
| member | typedefinitio | notes |
|---|---|---|
| value_type | The first template parameter (T) | |
| reference | value_type& | |
| const_reference | const value_type& | |
| pointer | value_type* | |
| const_pointer | const value_type* | |
| iterator | a random access iterator to value_type | convertible to const_iterator |
| const_iterator | a random access iterator to const value_type | |
| reverse_iterator | reverse_iterator | |
| const_reverse_iterator | reverse_iterator<const_iterator> | |
| size_type | size_t | unsigned integral type |
| difference_type | ptrdiff_t |
signed integral type
Member functions
Iterators
- begin: Return iterator to beginning (public member function )
- end: Return iterator to end (public member function )
- rbegin: Return reverse iterator to reverse beginning (public member function )
- rend: Return reverse iterator to reverse end (public member function )
- cbegin: Return const_iterator to beginning (public member function )
- cend: Return const_iterator to end (public member function )
- crbegin: Return const_reverse_iterator to reverse beginning (public member function )
- crend: Return const_reverse_iterator to reverse end (public member function )
Capacity
- size: Return size (public member function )
- max_size: Return maximum size (public member function )
- empty: Test whether array is empty (public member function )
Element access
- operator[]: Access element (public member function )
- at: Access element (public member function )
- front: Access first element (public member function )
- back: Access last element (public member function )
- data: Get pointer to data (public member function )
Modifiers
- fill: Fill array with value (public member function )
- swap: Swap content (public member function )
Non-member function overloads
- get (array): Get element (tuple interface) (function template )
- relational operators (array):Relational operators for array(function template )
Non-member class specializations
- tuple_element: Tuple element type for array (class template specialization )
- tuple_size: Tuple size traits for array (class template specialization )
参考文献
C++ std::array的更多相关文章
- c++编译错误C2971:"std::array":array_size:包含非静态存储不能用作废类型参数;参见“std::array”的声明
在Qt5中这段代码编写有两种方式:一个编译成功,一个失败 成功版本: static constexpr size_t block_size = 0x2000;//8KB static constexp ...
- std::array中的std::get<n>()
模板函数std::get<n>()是一个辅助函数,它能够获取到容器的第 n 个元素.模板参数的实参必须是一个在编译时可以确定的常量表达式,编译时会对它检查. get<n>()模 ...
- 将std::array转换成std::tuple
template<typename Array, std::size_t... Index> decltype(auto) array2tuple_impl(const Array& ...
- std::array,std::vector,基于范围的for循环
std::array除了有传统数组支持随机访问.效率高.存储大小固定等特点外,还支持迭代器访问.获取容量.获得原始指针等高级功能.而且它还不会退化成指针T *给开发人员造成困惑. for( 元素名变量 ...
- C++ Arrays, std::array, std::vector 总结
原文来自: https://shendrick.net/Coding%20Tips/2015/03/15/cpparrayvsvector.html @Seth Hendrick Original a ...
- C++语言中std::array的神奇用法总结,你需要知道!
摘要:在这篇文章里,将从各个角度介绍下std::array的用法,希望能带来一些启发. td::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此, ...
- C++ std::array 基本用法
#include <iostream> #include <string> #include <array> using namespace std; // htt ...
- 源码阅读笔记 - 2 std::vector (2) 关于Allocator Aware Container特性
所有的STL容器,都保存一个或默认,或由用户提供的allocator的实例,用来提供对象内存分配和构造的方法(除了std::array),这样的容器,被称作Allocator Aware Contai ...
- [翻译] C++ STL容器参考手册(第一章 <array>)
返回总册 本章节原文:http://www.cplusplus.com/reference/array/array/ 1. std::array (C++11支持) template < cla ...
随机推荐
- 旺财速啃H5框架之Bootstrap(五)
在上一篇<<旺财速啃H5框架之Bootstrap(四)>>做了基本的框架,<<旺财速啃H5框架之Bootstrap(二)>>篇里也大体认识了bootst ...
- 复杂的 Hash 函数组合有意义吗?
很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- 【翻译】MongoDB指南/聚合——聚合管道
[原文地址]https://docs.mongodb.com/manual/ 聚合 聚合操作处理数据记录并返回计算后的结果.聚合操作将多个文档分组,并能对已分组的数据执行一系列操作而返回单一结果.Mo ...
- 【WCF】错误协定声明
在上一篇烂文中,老周给大伙伴们介绍了 IErrorHandler 接口的使用,今天,老周补充一个错误处理的知识点——错误协定. 错误协定与IErrorHandler接口不同,大伙伴们应该记得,上回我们 ...
- 利用Node.js的Net模块实现一个命令行多人聊天室
1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...
- angular2系列教程(七)Injectable、Promise、Interface、使用服务
今天我们要讲的ng2的service这个概念,和ng1一样,service通常用于发送http请求,但其实你可以在里面封装任何你想封装的方法,有时候控制器之间的通讯也是依靠service来完成的,让我 ...
- H5项目开发分享——用Canvas合成文字
以前曾用Canvas合成.裁剪.图片等<用H5中的Canvas等技术制作海报>.这次用Canvas来画文字. 下图中"老王考到驾照后"这几个字是画在Canvas上的,与 ...
- 玩转spring boot——开篇
很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我 ...
- java中Action层、Service层和Dao层的功能区分
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...