【STL記錄】Containers--Arrays

Array是container class array<>的一個實例,是一個固定長度的元素序列。ios

在使用array以前,須要include頭文件:函數

#include <array>

1、初始化

// 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 };

2、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() 返回常量反向迭代器,位於第一個元素以前

3、Tuple Interface

    Array提供了tuple 接口,因此:spa

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

例:code

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")

 4、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;
}

輸出:orm

相關文章
相關標籤/搜索