首页 > 其他分享 >array

array

时间:2024-08-20 09:05:58浏览次数:9  
标签:迭代 int ary 元素 array include

array

array<T,N> 模板定义了一种相当于标准数组的容器类型。它是一个有 N 个 T 类型元素的固定序列。除了需要指定元素的类型和个数之外,它和常规数组没有太大的差别。显然,不能增加或删除元素。

模板实例的元素被内部存储在标准数组中。和标准数组相比,array 容器的额外幵销很小,但提供了两个优点:如果使用 at(),当用一个非法的索引访问数组元素时,能够被检测到,因为容器知道它有多少个元素,这也就意味着数组容器可以作为参数传给函数,而不再需要单独去指定数组元素的个数。

创建

#include <array>
#include <iostream>

using namespace std;

int main() {
    // 创建具有 10 个 int 类型的数组,但未初始化
    array<int, 10> data1;
    // 将所有元素设成给定值
    data1.fill(2);
    // 创建具有 10 个 int 类型的数组,初始化为默认值
    array<int, 10> data2{};
    // 前三个初始化为指定值,后面的都初始化成默认值
    array<int, 10> data3{1, 2, 3};
}

访问

#include <array>
#include <iostream>

using namespace std;

int main() {
    array<int, 10> ary{1, 2, 3, 4};

    // 没有做任何边界检査
    // cout << ary[22];
    // 检查越界索引值,会抛出 std::out_of_rang 异常
    // cout << ary.at(22);

    // 访问头尾
    cout << ary.front() + ary.back() << endl;
    // 返回容器底层用来存储元素的标准数组的地址
    cout << ary.data() << endl;
    // 模板函数 get<n>() 是一个辅助函数,它能够获取到容器的第 n 个元素
    cout << get<3>(ary) << endl;
    // 基于范围的循环
    for (int value: ary)
        cout << value << " ";
    cout << endl;

    // 判空和返回大小
    if (!ary.empty())
        cout << ary.size() << endl;
}

迭代器

数组模板定义了成员函数 begin() 和 end(),分别返回指向第一个元素和最后一个元素的下一个位置的随机访问迭代器。

#include <array>
#include <iostream>

using namespace std;

int main() {
    array<int, 10> ary{};
    // 迭代器对象是由 array 对象的成员函数 begin() 和 end() 返回
    auto first = ary.begin();
    array<int, 10>::iterator last = ary.end();
    while (first != last) {
        // 在循环中显式地使用迭代器来设置容器的值
        *first = 2;
        first++;
    }

    for (int i = 0; i < 10; ++i) {
        cout << ary[i] << " ";
    }
}

最好用全局的 begin() 和 end() 函数来从容器中获取迭代器,因为它们是通用的,first 和 last 可以像下面这样定义:

auto first = begin(ary);
array<int, 10>::iterator last = end(ary);

当迭代器指向容器中的一个特定元素时,它们没有保留任何关于容器本身的信息,所以我们无法从迭代器中判断,它是指向 array 容器还是指向 vector 容器。容器中的一段元素可以由迭代器指定,这让我们有了对它们使用算法的可能。

定义在 algorithm 头文件中的 generate() 函数模板,提供了用函数对象计算值、初始化一切元素的可能:

#include <array>
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    array<int, 10> ary{};
    int a{};
    int b{10};
    // generate() 的前两个参数分别是开始迭代器和结束迭代器,用来指定需要设置值的元素的范围
    // 第三个参数是一个 lambda 表达式。lambda 表达式以引用的方式捕获 b
    // mutable 使 lambda 表达式能够更新 a 局部副本的值,它是以值引用的方式捕获的。
    generate(begin(ary), end(ary), [a, &b]()mutable {
        return a++ + b;
    });
}

函数模板 iota() 可以做到用连续的递增值初始化一个数组容器:

#include <array>
#include <iostream>
#include <numeric>

using namespace std;

int main() {
    array<int, 10> ary{};
    // 前两个参数是迭代器,用来定义需要设置值的元素的范围。第三个参数是第一个元素要设置的值,通过递增运算生成了随后每一个元素的值
    iota(begin(ary), end(ary), 10);
}

容器定义了成员函数 cbegin() 和 cend(),它们可以返回 const 迭代器。当只想访问元素时,应该使用 const 迭代器。

元素比较

#include <array>
#include <iostream>

using namespace std;

int main() {
    array<int, 4> these{1, 2, 3, 4};
    array<int, 4> those{1, 2, 3, 4};
    array<int, 4> them{1, 3, 3, 2};

    // 对 ==,如果两个数组对应的元素都相等,会返回 true。对于 !=,两个数组中只要有一个元素不相等,就会返回 true。
    if (these == those) cout << "these and those are equal." << endl;
    if (those != them) cout << "those and them are not equal." << endl;
    if (those < them) cout << "those are less than them." << endl;

    // 只要它们存放的是相同类型、相同个数的元素,就可以将一个数组容器赋给另一个
    them = those;
}

标签:迭代,int,ary,元素,array,include
From: https://www.cnblogs.com/sprinining/p/18368703

相关文章

  • Java中ArrayList集合—基础详解(知识点+代码示例)
    ArrayList(集合)ArrayList(集合)ArrayList(集合)10.1ArrayList成员方法10.2集合练习10.2.1添加字符串10.2.2添加数字10.2.3添加学生对象并遍历10.2.4集合概述:集合可以直接存储引用数据类型,不能直接存储基本数据类型,如果要存储基本数据类型,需要将基本数据类型变成对......
  • Sasha and Array
    维护斐波那契数列乘上一个矩阵可以快速得出斐波那契数列这个比较简单~cpp#include<bits/stdc++.h>#defineclosestd::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)usingnamespacestd;typedeflonglongll;constllMAXN=3e5+7;constllmod=1e9+......
  • JSONUtil、JsonArray应用 (全网最全面的解析方式汇总) - 调用第三方接口后,获取的结果
    背景:近期开发的内容涉及到了我们平台对其他平台提供接口的调用,然后也涉及到接口提供方的验签等操作;还有我们的加签操作等。今天记录一下调用三方接口后返回的接口如何解析;怎么拿到自己想要的东西。其实调用三方接口分为几步1、采用哪种方式调用三方接口,这种依赖于第三方......
  • 【ArrayList】JDK1.8源码详细注释 以及如何实现线程安全的链表
    ArrayList(JDK8)ArrayList有四个内部类,成员内部类Itr,成员内部类ListItr,静态内部类SubList,ArrayListSpliterator(暂时用不到)Itr是Iterator的实现类,支持正向遍历,ArrayList的iterator方法返回一个Itr对象ListItr是ListIterator的实现类,支持双向遍历,ArrayList的listIterator方法......
  • ArrayList 和 LinkedList 的区别是什么
    数据结构实现:ArrayList是动态数组的数据结构实现,而LinkedList是双向链表的数据结构实现。随机访问效率:ArrayList比LinkedList在随机访问的时候效率要高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。增加和删除效率:在非首尾的增加和删除操......
  • ArrayList/Vector/ListedList
    ArrayList:是数组数据结构,扩容是通过扩容数组。可快速访问其中一个元素或修改。ListedList:是链表数据结构,可高效的实现中间元素修改/删除。但是访问没有数组高效。vector:是强同步的ArrayList ArrayList扩容步骤1.判断申请的元素后,元素数量超过现有容量。privatevoidens......
  • Java数组05:Arrays 类
    数组的工具类java.util.Arrays由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。文档简介:此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。......
  • 数组拷贝System.arraycopy
    数组拷贝第一种方式:packagecom.coding.demo.concurrent;importjava.util.Arrays;/***使用Arrays.copyOf()*/publicclassTestArraysCopyOf{publicstaticvoidmain(String[]args){int[]src={1,2,3,4,5,6,7,8,9};int[]dest=Arrays......
  • 4-ArrayList
    ArrayList实现类(JDK1.7)//接口=实现类--->为了扩展性这样做--->因为可以Collectioncol=newLinkedList();Collectioncol=newArrayList();Listlist=newArrayList();//直接创建实现类对象ArrayListal=newArrayList();......
  • 巧用Array.forEach:简化循环与增强代码可读性;Array.forEach怎么用;面对大量数据时怎么提
    目录Vue.js中的Array.forEach:简化循环与增强代码可读性一、引言二、Array.forEach()的使用与技巧1、基本语法2、返回值3、使用Array.forEach()的优势4、Array.forEachvsfor循环5、Array.forEach()使用技巧三、Array.forEach()的应用情景1、复杂数据处理2、实时更......