STL: ссылки Хранилищ или значения?

Используемый ранее упомянул решение sequielo и добавил функцию для проверки ширины/высоты (для предотвращения экранной ошибки вращения). Для выбора минуты / макс. границ для мобильной области просмотра, я использую этот ресурс https://www.mydevice.io/#compare-devices

function isMobile() {
    try{ document.createEvent("TouchEvent"); return true; }
    catch(e){ return false; }
}

function deviceType() {
    var width = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
    var height = Math.max(document.documentElement.clientHeight, window.innerHeight || 0),screenType;
    if (isMobile()){
        if ((width <= 650 && height <= 900) || (width <= 900 && height <= 650))
            screenType = "Mobile Phone";
        else
            screenType = "Tablet";
    }
    else
        screenType = "Desktop";
  return screenType;
}

12
задан jameszhao00 5 September 2009 в 06:29
поделиться

2 ответа

Контейнеры STL копируют, создают и сохраняют значения, которые вы передаете. Если вы хотите хранить объекты в контейнере , не копируя их , я бы предложил сохранить указатель на объект в контейнере:

class abc;
abc inst;
vector<abc *> vec;
vec.push_back(&inst);

Это наиболее логичный способ реализации контейнерных классов для предотвращения случайного сохранения ссылок на переменные в несуществующих фреймах стека. Примите во внимание:

class Widget {
public:
    void AddToVector(int i) {
        v.push_back(i);
    }
private:
    vector<int> v;
};

Сохранение ссылки на i было бы опасно, так как вы могли бы ссылаться на ячейку памяти локальной переменной после возврата из метода, в котором она была определена.

18
ответ дан 2 December 2019 в 07:03
поделиться

Это зависит от вашего типа. Если это простой тип значений и дешево копировать, то, вероятно, ответом будет сохранение значений. С другой стороны, если это ссылочный тип или копирование дорого, вам лучше сохранить интеллектуальный указатель (не auto_ptr, поскольку его особая семантика копирования не позволяет хранить его в контейнере. Используйте shared_ptr). С простым указателем вы рискуете утечкой памяти и доступом к освобожденной памяти, а со ссылками вы рискуете последним. Умный указатель позволяет избежать обоих.

4
ответ дан 2 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: