文档章节

【STL记录】Containers--Arrays

大道无名
 大道无名
发布于 2016/07/23 15:04
字数 888
阅读 3
收藏 0

Array是container class array<>的一个实例,是一个固定长度的元素序列。

在使用array之前,需要include头文件:

#include <array>

一、初始化

// all elements of x have value 0 (int())
array<int,4> x = {}; 

//use an initializer list to initialize array
array<int,5> coll = { 42, 377, 611, 21, 44 };  

// one element with value 42, followed by 9 elements with value 0
array<int,10> c2 = { 42 }; 

二、Array Operations

1.Class array<> 的构造函数

Table 1. Constructors of Class array<>
Operation Effect
 array<Elem, N> c 默认构造函数:使用默认初始化元素创建一个array
 array<Elem, N> c(c2) 复制构造函数:通过复制创建一个相同的array(所有元素都被复制)
 array<Elem, N> c = c2 复制构造函数:通过复制创建一个相同的array(所有元素都被复制)
 array<Elem, N> c(rv) Move constructor:creates a new array taking the contents of the rvalue rv
 array<Elem, N> c = rv Move constructor:creates a new array taking the contents of the rvalue rv
 array<Elem, N> c = initList Creates an array initialized with the elements of the initializer list

2.Nonmodifying Operations

Table 2. Nonmodifying Operatoions of Class array<>
Operation Effect
 c.empty() 返回容器是否为空(相当于size() == 0)
 c.size() 返回当前元素的个数
 c.max_size() 返回可能存在元素的最大个数
 c1 == c2 返回c1是否等于c2
 c1 != c2 返回c1是否不等于c2
 c1 < c2 返回c1是否小于c2
 c1 > c2 返回c1是否大于c2
 c1 <= c2 返回c1是否小于等于c2
 c1 >= c2 返回c1是否大于等于c2

3.Assignments

Table 3. Assignment Operations of Class array<>
Operation Effect
 c = c2 将c2所有的元素赋给c
 c = rv Move assigns all elements of the rvalue rv to c
 c.fill(val) 将值val赋给c的每一个元素
 c1.swap(c2) 交换c1和c2的数据
 swap(c1, c2) 交换c1和c2的数据

4.元素访问

Table 4. Direct Element Access of Class array<>
Operation Effect
 c[idx] 返回索引为idx的元素(没有边界检查)
 c.at(idx) 返回索引为idx的元素(当idx超出边界,抛出range-error异常)
 c.front() 返回第一个元素(不检查第一个元素是否存在)
 c.back() 返回最后一个元素(不检查最后一个元素是否存在)

5.Iterator Functions

Table 5. Iterator Operations of Class array<>
Operation Effect
 c.begin() 返回第一个元素的随机访问迭代器
 c.end() 返回位于最后一个元素之后的随机访问迭代器
 c.cbegin() 返回第一个元素的常量随机存取迭代器
 c.cend() 返回位于最后一个元素之后的常量随机访问迭代器
 c.rbegin() 返回反向迭代器,指向最后一个元素
 c.rend() 返回反向迭代器,位于第一个元素之前
 c.crbegin() 返回常量反向迭代器,指向最后一个元素
 c.crend() 返回常量反向迭代器,位于第一个元素之前

三、Tuple Interface

    Array提供了tuple 接口,所以:

  • tuple_size<>::value    number of elements
  • tuple_element<>::type    the type of a specific element
  • get()    gain access to a specific element

例:

typedef std::array<std::string, 5> FileStrings;
FiveStrings a  = {"hello", "nico", "how", "are", "you"};

std::tuple_size<FiveStrings>::value       // 5
std::tuple_element<1, FiveStrings>::type  // std::string
std::get<1>(a)                            // std::string("nico")

 四、Example of Using Arrays

#include <array>
#include <algorithm>
#include <functional>
#include <numeric>
#include "print.hpp"
using namespace std;

int main()
{
    //create array with 10 ints
    array<int, 10> a = {11, 22, 33, 44 };
    PRINT_ELEMENTS(a);

    //modify last two elements
    a.back() = 9999999;
    a[a.size() - 2] = 42;
    PRINT_ELEMENTS(a);

    //process sum of all elements
    cout<< "sum: "
        << accumulate(a.begin(), a.end(), 0)
        << endl;
    
    //negate all elements
    transform(a.begin(), a.end(),   //source
              a.begin(),            //destinatic
              negate<int>());       //operation
    PRINT_ELEMENTS(a);
}


// print.hpp

#include<iostream>
#include<string>

//PRINT_ELEMENTS()
// - prints optional string optstr followed by
// - all elements of the collection coll
// - in one line,separated by spaces
template <typename T>
inline void PRINT_ELEMENTS(const T& coll, const std::string& optstr="")
{
	std::cout << optstr;
	for(const auto& elem : coll) {
		std::cout << elem << ' ';
	}
	std::cout << std::endl;
}

输出:

 

 

© 著作权归作者所有

大道无名
粉丝 29
博文 161
码字总数 96019
作品 0
宣城
程序员
私信 提问
【STL记录】Containers--Lists

list以双链表的形式管理元素: 使用list时,需要加上头文件: list与array,vector,deque的不同之处: list不提供随机访问,比如要访问第五个元素,你必须从第一个元素开始通过链指针到第五...

大道无名
2016/07/24
8
0
【STL记录】Containers--Deques

Deque和vector很像,区别是deque可以在两头插入和删除。 要使用deque,需加上头文件: 一、Abilities of Deque 1.deque与vector的不同之处 在头尾插入和移除元素都很快 访问元素的内部结构更...

大道无名
2016/07/23
3
0
【STL记录】Containers--Vectors

Vector类似于一个动态数组 使用vector,需加入头文件: 一、Abilities of Vectors Vector复制所有元素到它的内部动态数组中。通常这些元素是有一定顺序的,因此vector是一种有序集合。 Vect...

大道无名
2016/07/23
4
0
C++ STL----associative containers

Set: Sets are typically implemented as binary search trees. Therefore, the main characteristics of set as an associative container are: Unique element values: no two elements in......

zhujianbest
2010/06/08
0
0
java 通配符的使用-upcast

package localevidence;//: generics/UnboundedWildcards1.java//: generics/CovariantArrays.javaclass Fruit {}class Appleee extends Fruit {}class Jonathan extends Appleee {}class Or......

Oscarfff
2015/04/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

安卓Q | 文件存储沙箱化FAQ,你想知道的这里都有!

文件存储沙箱化作为Android Q最为重要的变更之一,对应用文件存储、访问、分享等操作都带来重大的影响,被众多开发者关注和讨论。本文邀请华为技术专家对开发者提到的重点问题进行了解答,以...

安卓绿色联盟
28分钟前
1
0
可以提高程序员效率的工具!

前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 本文记录一下我在平时喜欢用的一些小工具,以便以后重装系统/换电脑的时候能快速安装...

Java3y
50分钟前
4
0
将博客搬至CSDN

https://blog.csdn.net/qq_38157006

Marhal
56分钟前
1
0
unicode Java中求字符串长度length()和codePointCount()的区别

在计算字符串长度时,Java的两种方法length()和codePointCount()一度让我困惑,运行书上例子得到的长度值是相等的,那为什么要设定两个方法呢? 对于普通字符串,这两种方法得到的值是一样的...

泉天下
56分钟前
2
0
uin-app 一、学习理由

选择uni-app 理由 别人的理由 1. 5+ 有HTML5+和Native.js技术,HTML5+包含常用的跨平台的几百个API,能满足常规开发需求,而Native.js把40w原生api映 射成js对象,这样js可以直接调原生。HTM...

轻轻的往前走
58分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部