• Умные указатели?

    Nipheris
    @Nipheris Куратор тега C++
    Вы, возможно, еще недостаточно освоили ОО-возможности языка C++. Тогда ваш вопрос более чем логичен.

    Видите ли, в языке, где есть какая-либо ОО-модель, неизбежно будут выделяться две категории типов данных - типы данных, экзмепляры которых ведут себя как значения (values), и типы данных, экземпляры которых ведут себя как переменные/объекты (если тут непонятно, опишу подробнее).

    Отличительной особенностью объекта с теоретической точки зрения является identity - некий ключ или признак, с помощью которого этот объект уникальным образом идентифицируется. В ОО базах данных в качестве identity используется т.н. OID. В C++ в качестве identity объектов используются указатели. Это удобно, т.к. место объекта в памяти однозначно идентифицирует его (тут как раз и прослеживается тот факт, что объекты в C++ - это суть переменные, изменять состояние которых можно только строго определенным образом).

    Хотя язык C++ позволяет в теории работать с любым типом как "по значению", так и посредством указателей, реальные классы обычно проектируются так, чтобы подчеркнуть их семантику значение/объект. Например, для типов которые ведут себя как "значения" пишется конструктор копирования и разрешаются операции присвоения. Для типов-"объектов" наоборот, операция присвоения и конструктор копирования запрещаются. Конечно, ничто не мешает превратить указатель в ссылку и работать по ссылке, однако использование ссылки "прячет" от нас информацию об identity объекта. Например, для сравнения одинаковости двух объектов (если это именно "объекты", а не "значения") достаточно сравнить лишь их identity, в терминах C++ - указатели. Если вы превратили их в ссылки, вам придется использовать операцию взятия адреса: &a == &b, что менее логично и удобно, чем сравнить обычные указатели: a == b. Кроме того, важным отличием указателя является то, что одним из его допустимых значений является nullptr, что также может быть удобным (а может и нет).

    Однако, обычные указатели хоть и являются удобным способом моделирования понятия identity, они не предоставляют какой-либо помощи для управления жизненным циклом динамических переменных (коими являются большинство объектов). В результате, программисту гораздо менее удобно использовать динамические переменные, нежели автоматические. И чтобы убить двух зайцев сразу - иметь динамические переменные-объекты с гибким временем жизни и с уникальным identity, и управлять ими удобным способом - придумали умные указатели. По сути эти указатели привязывают тем или иным образом время жизни динамической переменной к структуре программы и к местам использования этих переменных путем реализации концепций владения переменной.
    Ответ написан
    Комментировать
  • Что лучше использовать std::vector или простой массив в c++?

    @DancingOnWater
    В вашем случае вектор однозначно удобнее будет как владелец памяти: упрощается многие рутинные выделения и освбождения.
    А вот выбор способа доступа к элементам зависит от ответов на следующие вопросы:
    1) Потребуется ли вам арифметика?
    2) Возможна ли векторизация ваших операций?

    Если хотя бы на один отвечаете да - с помощью вектора получите указатель и дальше используйте сырые указатели. В противном случае используете те методы доступа, что предлагает контейнер
    Ответ написан
    Комментировать
  • Что лучше использовать std::vector или простой массив в c++?

    difiso
    @difiso
    В параллельной вселенной я космонавт
    Из массива и vector'а лучше использовать vector - там итераторы есть, а это более удобный обход массива и при обходе сложнее за границы выйти. Можно еще в сторону List посмотреть, но там данные хранятся по другому и list занимает памяти немного больше в общем случае.
    Ответ написан
    5 комментариев
  • Что лучше использовать std::vector или простой массив в c++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    vector практически всегда не хуже обычного массива.
    Ответ написан
    Комментировать
  • Что лучше использовать std::vector или простой массив в c++?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    я бы ring-buffer организовал, если это дело в реалтайме надо делать.
    Ответ написан
    Комментировать