Предыдущий пост -
Следующий пост -

std::array

Рубрика: Контейнеры, Дата: 4 June, 2013, Автор:
Tags: ,

Это я даже не знаю, что за контейнер. С ним я не сталкивался. Чуток за него читал. Но это ясно что это массив, но почему то мы всегда std::vector используем.

Заголовочные файлы

#include <array>
using std::array;

Рассмотрим конструкторы (constructs)

В array конструкторы такие как и у vector. Смотрите по ссылке: http://www.kselax.ru/2013/05/1127/

Да увы те конструкторы что для std::vector не работают для std::array. Ну да ладно, пока что конструктора пропустим просто, потом напишем их.

Приведем небольшие примерчики инициализации array.

Рассмотри итераторы

Имеется прямые и реверсивные итераторы, константные и не константные. Рассмотрим не константные прямые и обратные итераторы.

#include <iostream>
using std::cout;
using std::endl;
#include <array>
using std::array;

int main()
{
	//создаем массив на 5 элементов
	array<int, 5> a={1,2,3,4,5};

	//создаем итератор
	array<int, 5>::iterator it;
	for(it=a.begin();it!=a.end();++it)
		cout <<*it<<' ';
	cout <<endl;

	//создание реверсиного итератора
	array<int, 5>::reverse_iterator r_it;
	for(r_it=a.rbegin();r_it!=a.rend();++r_it)
		cout <<*r_it<<' ';
	cout <<endl;

	return 0;
}

Теперь константный прямой и обратный итератор, рассмотрим.

#include <iostream>
using std::cout;
using std::endl;
#include <array>
using std::array;

int main()
{
	//создаем массив на 5 элементов
	array<int, 5> a={1,2,3,4,5};

	//создаем итератор
	array<int, 5>::const_iterator it;
	for(it=a.begin();it!=a.end();++it)
		cout <<*it<<' ';
	cout <<endl;

	//создание реверсиного итератора
	array<int, 5>::const_reverse_iterator r_it;
	for(r_it=a.rbegin();r_it!=a.rend();++r_it)
		cout <<*r_it<<' ';
	cout <<endl;

	return 0;
}

Еще раз повторю отличие константных итераторов от не константных это в том что не константные итераторы могут модифицировать данные.

Рассмотрим емкость (capacity)

array::size()

Функция возвращает размер массива.

#include <iostream>
using std::cout;
using std::endl;
#include <array>
using std::array;

int main()
{
	//создаем массив на 5 элементов
	array<int, 5> a={1,2,3,4,5};

	//выведем размер массива
	cout <<"a.size()= "<<a.size()<<endl;//5

	return 0;
}

array::max_size()

Функция возвращает максимальный размер массива на данном компьютере.

Должно возвращать, но как оказалось возвращает всего навсего 5. Я честно не пойму почему, но фиг с ним.

#include <iostream>
using std::cout;
using std::endl;
#include <array>
using std::array;

int main()
{
	//создаем массив на 5 элементов
	array<int, 5> a={1,2,3,4,5};

	//выведем размер массива
	cout <<"a.mas_size()= "<<a.max_size()<<endl;//5

	return 0;
}

array::empty()

Если массив пустой то функция возвращает true, если не пустая то возвращает false.

#include <iostream>
using std::cout;
using std::endl;
#include <array>
using std::array;

int main()
{
	//создаем массив на 5 элементов
	array<int, 5> a={1,2,3,4,5};

	if(a.empty())cout <<"a is empty"<<endl;
	else cout <<"a is not empty"<<endl;//a is not empty

	return 0;
}

Элементы доступа (element access)

array::operator[]()

Функция доступа без проверки выхода за пределы.

#include <iostream>
using std::cout;
using std::endl;
#include <array>
using std::array;

int main()
{
	//создаем массив на 5 элементов
	array<int, 5> a={1,2,3,4,5};

	cout <<"a[0]= "<<a[0]<<endl;//1
	cout <<"a[1]= "<<a[1]<<endl;//2
	cout <<"a[4]= "<<a[4]<<endl;//5

	return 0;
}

array::at()

Функция доступа к элементам с проверкой выхода за границы. Если выход за пределы, то выбрасывается out_of_range.

#include <iostream>
using std::cout;
using std::endl;
#include <array>
using std::array;
#include <stdexcept>
using std::out_of_range;

int main()
{
	//создаем массив на 5 элементов
	array<int, 5> a={1,2,3,4,5};

	try
	{
		cout <<"a.at(1)= "<<a.at(1)<<endl;//2
		cout <<"a.at(2)= "<<a.at(2)<<endl;//3
		cout <<"a.at(5)= "<<a.at(5)<<endl;//выброс исключения
	}
	catch(out_of_range& e)
	{
		cout <<"out_of_range"<<endl;
	}

	return 0;
}

array::fron() и array::back()

Функции доступа к первому и последнему элементов массива.

#include <iostream>
using std::cout;
using std::endl;
#include <array>
using std::array;
#include <stdexcept>
using std::out_of_range;

int main()
{
	//создаем массив на 5 элементов
	array<int, 5> a={1,2,3,4,5};

	cout <<"a.fron()= "<<a.front()<<endl;//1
	cout <<"a.back()= "<<a.back()<<endl;//5

	return 0;
}

array::data()

Функция доступа к данным массива. Как бы к внутреннему представлению наверно хз.

#include <iostream>
using std::cout;
using std::endl;
#include <array>
using std::array;
#include <cstring>
using std::memcpy;

int main()
{
	const char* ch="Hellow world";
	array<char,12> a;

	cout <<"a.data()= "<<a.data()<<endl;
	memcpy(a.data(),ch,12);
	cout <<"a.data()= "<<a.data()<<endl;

	return 0;
}

Рассмотрим модификаторы (modifiers)

array::fill()

Функция принимает аргумент и делает все элементы массива равными этому аргументу.

#include <iostream>
using std::cout;
using std::endl;
#include <array>
using std::array;

int main()
{
	array<int, 6> a={1,2,3,4,5,6};

	//выведем данные
	for(int i=0;i<6;i++)
		cout <<a[i]<<' ';//1 2 3 4 5 6
	cout <<endl;

	//используем fill
	a.fill(5);

	//выведем снова данные
	for(int i=0;i<6;i++)
		cout <<a[i]<<' ';//5 5 5 5 5 5
	cout <<endl;

	return 0;
}

array::swap()

Функция меняет местами два массива. Да меняет размеры только одинаковых размеров.

#include <iostream>
using std::cout;
using std::endl;
#include <array>
using std::array;

int main()
{
	array<int, 6> a={1,2,3,4,5,6};
	array<int, 6> b={10,20,30,40,50,60};

	//выведем массив
	for(int i=0;i<6;i++)
		cout <<a[i]<<' ';
	cout <<endl;
	for(int i=0;i<6;i++)
		cout <<b[i]<<' ';
	cout <<endl;

	//обменяем массивы
	a.swap(b);

	//выведем снова
	for(int i=0;i<6;i++)
		cout <<a[i]<<' ';
	cout <<endl;
	for(int i=0;i<6;i++)
		cout <<b[i]<<' ';
	cout <<endl;

	return 0;
}

array::get(array)

Функция возвращает элемент массива.

#include <iostream>
using std::cout;
using std::endl;
#include <array>
using std::array;
using std::get;

int main()
{
	array<int, 5> a={1,2,3,4,5};

	cout <<"first element= "<<get<0>(a)<<endl;//1
	cout <<"last element= "<<get<4>(a)<<endl;//5

	return 0;
}

Рассмотрим операторы сравнения (relational operations)

#include <iostream>
using std::cout;
using std::endl;
#include <array>
using std::array;
using std::get;

int main()
{
	array<int, 5> a={1,2,3,4,5};
	array<int, 5> b={3,4,5,6,7};

	if(a==b)cout <<"a==b"<<endl;
	if(a!=b)cout <<"a!=b"<<endl;//a!=b
	if(a>b)cout <<"a>b"<<endl;
	if(a<b)cout <<"a<b"<<endl;//a<b
	if(a>=b)cout <<"a>=b"<<endl;
	if(a<=b)cout <<"a<=b"<<endl;//a<=b

	return 0;
}

На этом закончим рассматривать. Идем дальше.

[youtube]http://www.youtube.com/watch?v=aECf2pqNP1k[/youtube]

rss