Используемый ранее упомянул решение 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;
}
Контейнеры 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
было бы опасно, так как вы могли бы ссылаться на ячейку памяти локальной переменной после возврата из метода, в котором она была определена.
Это зависит от вашего типа. Если это простой тип значений и дешево копировать, то, вероятно, ответом будет сохранение значений. С другой стороны, если это ссылочный тип или копирование дорого, вам лучше сохранить интеллектуальный указатель (не auto_ptr, поскольку его особая семантика копирования не позволяет хранить его в контейнере. Используйте shared_ptr). С простым указателем вы рискуете утечкой памяти и доступом к освобожденной памяти, а со ссылками вы рискуете последним. Умный указатель позволяет избежать обоих.