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

Показаны статьи и заметки из категорий: Структуры данных ×

Кортеж (std::tuple) появился в стандартной библиотеке начиная с С++11. Это неоднородный список элементов, типы которых задаются или выводятся на этапе компиляции. Кортеж "похож" на пару (std::pair), однако он может содержать произвольное (хотя и конечное) количество элементов. Интерфейс кортежа довольно простой: http://en.cppreference.com/w/cpp/utility/tuple

Создать кортеж можно так:

#include <tuple>

std::tuple<std::string, int, double> tuple_("hello", 42, 3.14);

Про кортеж говорят, что это коллекция гетерогенных значений (разнородных). Поэтому тип элемента (value_type), который определен в любом стандартном контейнере, не имеет смысла в кортеже, и просто отсутствует, ровно как и любой из типов итераторов. Кортеж не является обычным контейнерным классом, и не отвечает концепции контейнеров в С++ (http://en.cppreference.com/w/cpp/concept/Container). Поэтому простого способа обхода элементов кортежа нет. К нему не применимы какие-либо циклы:

for (auto& x : tuple_);  // Ошибка компиляции!

error: no viable 'begin' function available

"Пройтись" по элементам кортежа можно только точно зная количество его аргументов на этапе компиляции. Для этого нужно использовать функцию get:

std::get<0>(tuple_); // индекс элемента в качестве аргумента шаблона
std::get<1>(tuple_);
std::get<2>(tuple_);

При этом передача индекса во время выполнения программы невозможна:

int i = 0;
std::get<i>(tuple_);  // Ошибка компиляции!

Однако, задействовав шаблонное метапрограммирование, можно создать более удобный способ обхода кортежа на этапе компиляции.

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



Проблемы в std::map, которые хотят решить в C++17

Следующей мажорной версией стандарта языка C++ должна стать версия "C++17"  (также известная как C++1z). А документ "C++14" станет лишь небольшым расширением текущего стандарта, и будет в основном содержать исправления ошибок и небольшие улучшения C++11. Скорее всего выход новой мажорной версии стандарта не состоится в 2017 году, однако, работа над ним уже идет в полную силу. 

В переписке членов Комитета и их рабочих документах можно найти массу интересного по C++.  Например, в документе под номером N3873 автора Thomas Köppe, который называется: "Улучшение операций вставки для контейнеров std::map и std::unordered_map", рассказывается о том, что текущий интерфейс названных контейнеров имеет несколько неопределенное поведение в части вставки новых элементов с использованием методов insert и emplace. Рассмотрим подробнее, о чем идет речь в документе N3873.

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



Про 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.

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

Показаны статьи и заметки из категорий: Структуры данных ×