Разработка приложений на C++
  • Введение
  • Особенности разработки программ на С++
    • Указатель на функцию
    • Преобразование типов
    • Наследование
    • Виртуальные функции
    • Перегрузка операций
    • Функциональные объекты
    • Шаблоны
    • Пространства имён
    • Обработка исключительных ситуаций
    • Немного о компиляции и сборке
    • Рекоммендации по написанию кода
    • Новые возможности стандарта С++11
    • Терминология
  • Понятие структур данных
    • Массивы
    • Динамические структуры
  • Метапрограммирование
    • Шаблоны функций
    • Шаблоны классов
    • Специализация шаблонов
      • Пример: вычисление факториала
      • Пример: числа Фиббоначчи
    • Конфигурации шаблонных классов
  • Стандартная библиотека С++
    • Обзор стандартной библиотеки С++
    • Структура стандартной библиотеки С++
      • Концепции
    • Ввод-вывод данных
    • Примитивы, определённые в библиотеке STL
    • Итераторы
    • Контейнеры
      • Inplus: Как это работает
    • Алгоритмы
      • inplus: Как это работает
    • Примеры использования стандартной библиотеки С++
    • Стандартная библиотека С++/Вопросы
    • Стандартная библиотека С++/Примеры лабораторных работ
  • Разработка и использование библиотек программирования
    • Создание библиотек программирования
    • Использование динамических библиотек
    • Вопросы
    • Примеры лабораторных работ
  • Ответы на вопросы
Powered by GitBook
On this page
  • Общие рекомендации по использованию STL
  • Реализация класса array, совместимого со стандартной библиотекой С++
  1. Стандартная библиотека С++
  2. Контейнеры

Inplus: Как это работает

Приведенные таблицы показывают, каким требованиям должен удовлетворять интерфейс контейнера, чтобы его можно было использовать вместе с алгоритмами из стандартной библиотеки С++.

Некоторые рекомендации по использованию контейнеров

Критерий
Рекомендация

Возможность вставки нового элемента на произвольную позицию контейнера

Если нужна, выбирайте последовательный контейнер; ассоциативные контейнеры не подходят.

быстрая вставка

list

Структура памяти контейнера должна соответствовать правилам языка C

Только vector

критична скорость поиска

Рассмотрите сортированные векторы и ассоциативные контейнеры

Общие рекомендации по использованию STL

  • Не пытайтесь писать контейнерно-независимый код, так вы себя ограничиваете в возможностях

  • Реализуйте быстрое и корректное копирование объектов в контейнерах

  • Старайтесь не использовать итераторы повторно (особенно после удаления элементов из контейнера)

  • Используйте алгоритмы вместо циклов

  • Всегда включайте только нужные заголовки - это позволит сократить время компиляции

  • Научитесь читать сообщения компилятора

  • Обязательно прочтите следующие книги:

    • Герб Саттер, Андрей Александреску, Стандарты программирования на С++

    • Герб Саттер, Решение сложных задач на С++

Реализация класса array, совместимого со стандартной библиотекой С++

Подобная реализация существует в С++, начиная со стандарта С++11.

array.cpp
template <typename TYPE, size_t SIZE>
class array{
    TYPE el[SIZE];
public:
    typedef TYPE value_type;
    typedef TYPE& reference;
    typedef const TYPE& const_reference;
    typedef TYPE* pointer;
    typedef const TYPE* const_pointer;
    typedef TYPE* iterator;
    typedef const TYPE* const_iterator;

    array(){}
    array(TYPE* p, size_t s){
        size_t i;
        for(i = 0; i != s && i != SIZE; ++i){
            el[i] = p[i];
        }
    }
    array(const array<TYPE, SIZE>& a){
        size_t i;
        for(i = 0; i != SIZE; ++i){
            el[i] = a.el[i];
        }
    }
    ~array(){}

    array<TYPE, SIZE> operator = (const array<TYPE, SIZE>& a){
        size_t i;
        for(i = 0; i != SIZE; ++i){
            el[i] = a.el[i];
        }
        return *this;
    }
    TYPE& operator [](const size_t& i){
        return el[i];
    }


    iterator begin() { return el; }
    const_iterator begin() const { return el; }
    iterator end() { return el + SIZE; }
    const_iterator end() const { return el + SIZE; }

    bool operator == (const array<TYPE, SIZE>& a){
        size_t i;
        for(i = 0; i != SIZE; ++i){
            if( el[i] != a.el[i]) return false;
        }
        return true;
    }

    size_t size() const { return SIZE; }
    size_t max_size() const { return SIZE; }
    bool empty() const { return false; }

    void swap(array<TYPE, SIZE>& a){
        array<TYPE, SIZE> tmp = a;
        a = *this;
        *this = tmp;
    }
};
PreviousКонтейнерыNextАлгоритмы

Last updated 1 year ago