C++STLの配列Array(C++11)

4149 ワード

一、配列の簡単な使用及び使用時のテスト:
#include
#include
#include//qsort bsearch NULL
#include
using namespace std;


const int SIZE = 100000;// 
int main()
{
   // long , SIZE
	arrayarr;
    
	clock_t start = clock();//ms
	for (int i = 0; i < SIZE; i++)
	{
		arr[i] = rand()%100000;
	}
	cout << " 100000 : " << (clock() - start) << endl;
	cout << "array.size()" << arr.size() << endl;
	cout << "array.front()" << arr.front() << endl;
	cout << "array.back()" << arr.back() << endl;
	cout << "array.data()" << arr.data() << endl;// 
	
	//qsort();
	//bsearch();
	return 0;
}
 :
 100000 : 16
array.size()100000
array.front()41
array.back()1629
array.data()0069E2BC
 . . .

 , run 

二、配列の下層構造分析
template
	class array
	{	// fixed size array of values
public:
	enum {_EEN_SIZE = _Size};	// helper for expression evaluator
	typedef array<_ty _size=""> _Myt;
	typedef _Ty value_type;
	typedef size_t size_type;
	typedef ptrdiff_t difference_type;
	typedef _Ty *pointer;
	typedef const _Ty *const_pointer;
	typedef _Ty& reference;
	typedef const _Ty& const_reference;
	// 
	typedef _Array_iterator<_ty _size=""> iterator;
	typedef _Array_const_iterator<_ty _size=""> const_iterator;
	// 
	typedef _STD reverse_iterator reverse_iterator;
	typedef _STD reverse_iterator const_reverse_iterator;

	void assign(const _Ty& _Value){}
	void fill(const _Ty& _Value)	{}
	void swap(_Myt& _Other)_NOEXCEPT_OP(_NOEXCEPT_OP(_Swap_adl(_Elems[0], _Elems[0]))){	}
	iterator begin() _NOEXCEPT{}
	const_iterator begin() const _NOEXCEPT{}
	iterator end() _NOEXCEPT	{}
	size_type size() const _NOEXCEPT{}
	bool empty() const _NOEXCEPT{}
	const_reference at(size_type _Pos) const{}
	reference operator[](size_type _Pos){}
	const_reference operator[](size_type _Pos) const{}
	reference front(){	}
	const_reference front() const{}
	reference back(){}
	const_reference back() const{}
	_Ty *data() _NOEXCEPT{}
	const _Ty *data() const _NOEXCEPT{}

	// 
	_Ty _Elems[_Size == 0 ? 1 : _Size];
	};

ここでは私のVS 2013のArray部分SourceCodeを羅列し、主に3つの部分です.
1. array ;
2. ;
3. :	_Ty _Elems[_Size == 0 ? 1 : _Size];
 , 0 , 1 

異なるコンパイラでの実装にはいくつかの違いがあるかもしれませんが、基本的な考え方と方法の使用は一致しています.そうしないと、標準テンプレートライブラリとはどのように呼ばれますか.標準の意味はすべてのプラットフォームが従うべきで、STLの理解に影響しません.
具体的には、上記のプレゼンテーションコードで使用したいくつかの方法の実装を見てみましょう.
//typedef _Ty& reference;
reference front()// 
{	
	return (_Elems[0]);
}
reference back()// 
{	
	return (_Elems[_Size - 1]);
}
_Ty *data() _NOEXCEPT// 
{
	return (_Elems);
}
//typedef size_t size_type;
size_type size() const _NOEXCEPT// size
{
	return (_Size);
}
 ,array , 

しかし、特徴ではない特徴を見つけることができます.
array , ....
array , , C 

三、最後に公式文書の例を見ます.
#include 
#include 
#include 
#include 
#include 
 
int main()
{
    // construction uses aggregate initialization
    std::array a1{ {1, 2, 3} }; // double-braces required in C++11 prior to the CWG 1270 revision
                                        // (not needed in C++11 after the revision and in C++14 and beyond)
    std::array a2 = {1, 2, 3};  // never required after =
    std::array<:string> a3 = { std::string("a"), "b" };
 
    // container operations are supported
    std::sort(a1.begin(), a1.end());
    std::reverse_copy(a2.begin(), a2.end(), 
                      std::ostream_iterator(std::cout, " "));
 
    std::cout << '
'; // ranged for loop is supported for(const auto& s: a3) } : 3 2 1 a b

参照先:https://en.cppreference.com/w/cpp/container/array