Удобное место, чтобы написать свою статью или просто почитать

Показаны статьи и заметки из категорий: Языки программирования ×

Контейнер ссылок в C++ или зачем нужен std::reference_wrapper ?

Прежде чем, тронуть std::reference_wrapper давайте рассмотрим несколько задач, некоторые из которых могут показаться странными на первый взгляд. 

Задача первая

Ссылки в C++ не могут выступать в качестве типа элементов массива или контейнера STL:

std::vector< std::string& > cont; // Ошибка на этапе компиляции

Конечно можно использовать указатели в качестве элементов контейнера, однако в этом случае оказывается задействован синтаксис указателей. Поэтому, иногда очень хочется организовать контейнер, хранящий ссылки. Как этого можно добиться? Читаем далее.

Задача вторая

Инициализация ссылки происходит при её объявлении. После объявления ссылки её невозможно привязать к другой переменной. Однако можно легко создать похожее по семантике поведение и сделать что-то вроде "повторной инициализации" ссылки.

Задача третья

Многие алгоритмы в STL могут принимать функторы (функциональные объекты) в качестве своих аргументов. Передача аргументов алгоритму, в том числе и функторов, происходит по значению. Это затрудняет использование внутреннего состояния функторов. К примеру: как подсчитать количество операций сравнения в алгоритме std::sort?

Решим все эти задачи.

Читать полностью | | | | 7254



Про size() у std::list, в чем сложность?

Практически все контейнеры из стандартной библиотеки STL реализуют метод size. Всем известно, что данная функция-член возвращает количество элементов в контейнере. Однако,  сложность такой операции для известного контейнера std::list не определена однозначно. В реализации STL от Microsoft сложность операции size равна O(1), то есть константная, и не зависит от количества элементов. Напротив, в GCC сложность операции size равна O(N) - линейная, что существенно ограничивает возможности её применения, особенно там, где важна производительность. Ведь каждый раз при вызове size, Вы фактически будете инициировать полный проход по всему списку. В чем же причина такой неоднозначности?

Материал статьи основан на публикации Howard Hinnant: 

http://howardhinnant.github.io/On_list_size.html

Howard Hinnant работает в компании Apple, и является членом комитета по стандартизации C++ от компании Apple. Также он занимается разработкой библиотеки Boost.

Читать полностью | | | | 1678



Данная статья рассчитана на неискушенного программиста C++. С другой стороны любой, кто программирует на C++ обязан знать то, что описывается ниже. Речь пойдет об одном из самых популярных контейнеров в STL. А именно, о векторе (std::vector). С него, обычно, начинается описание контейнеров в книгах по языку C++ и STL. Считается, что это наиболее простой контейнер, с понятным интерфейсом и предсказуемым временем операций. Однако, за описанием интерфейса часто "теряются" основные правила при работе с вектором, которые могут быть не так очевидны  для начинающего программиста. Но, обо всем попорядку.

Читать полностью | | | | 12341

Показаны статьи и заметки из категорий: Языки программирования ×