Страницы

Поиск по вопросам

суббота, 29 декабря 2018 г.

Разименование итератора в std::set

Доброго времени суток! Я недавно начал заниматься программированием и сейчас возникла потребность в рассмотрении контейнера std::set(далее именуемый контейнер). И у меня возникло несколько вопросов, поискав в интернете не нашел подходящих ответов, решил спросить у знающих людей, которые могли бы помочь мне. И так суть вопроса, имеется контейнер типа const char* в который мы добавляем 2 элемента. typedef std::tr1::unordered_set unordered_set; unordered_set myUnorderedSet; myUnorderedSet.insert("testAction"); myUnorderedSet.insert("testActionTwo"); далее если пробежаться по контейнеру for ( unordered_set::iterator it = myUnorderedSet.begin(); it != myUnorderedSet.end(); ++it ) { std::cout << " " << *it; std::cout << std::endl; } можно вывести значения хранящиеся в данном контейнере. Затем я пытаюсь найти нужное мне значение используя метод find(). unordered_set::iterator = myUnorderedSet.find("testAction"); Как получить значение данного итератора, для того чтобы можно было сравнить его со значение которое я добавлял в контейнер*? И почему при такой записи *iter я получаю ошибку компиляции: list iterator is not dereferencable. Не совсем понимаю, ведь for ( unordered_set::iterator it = myUnorderedSet.begin(); it != myUnorderedSet.end(); ++it ) { std::cout << " " << *it; std::cout << std::endl; } мы можем применить операцию разыменования. Заранее благодарен за ответы!


Ответ

смотрим описание метода find() тут(ru) или тут(en) и видим что если find ничего не находит то возвращает итератор на end(), то есть на элемент следующий за последним и он (итератор end()) действительно не разыменуемый (is not dereferencable) то есть имея массив из 5 элементов [0,1,2,3,4] find ненайдя ничего вернёт [5] то есть end() соответственно для проверки "а нашлось ли чего нибудь" сравниваем if(iterator==myUnorderedSet.end()) почему так происходит? в set'e вы храните не строку testAction а указатель на неё и в функции find() сравниваются указатели! когда вы пишите строку в хардкоде то она помещается в специально отведённое место в программе, а вместо неё используется указатель на это место, написав два раза одинаковую строку testAction получаем две строки в специально отведённом месте (НО компиляторы могут с оптимизировать такие строки, в итоге имеем UB) как сравнивать строки? в STL есть тип данных(class) для строк string пихаем строки в стринг и при сравнении будет происходить преобразование string str="hello world";// или string str("hello world"); if(str=="hello world")//TRUE

Кэширование лямбда-выражений C#

Столкнулся со следующим: Написав свою функцию кэширования значений лямбда-выражений(думал это ускорит работу программы на повторных прогонах со старыми входными данными), я приступил к тестированию, но заметил, что даже без использования моего кэширования программа на втором прогоне выражений затрачивает уже значительно меньше тиков процессора(примерно вдвое меньше). Т.е. есть подозрение, что кэширование для значений лямбда-выражений уже реализовано в C# по умолчанию, так ли это?


Ответ

Лямбда-выражение — не более чем хитро оформленный указатель на функцию, так что кешированием вы не добьётесь ощутимого выигрыша в производительности. Не пытайтесь ускорить программу, не проведя профилирование. По поводу второго прогона — думаю, вы столкнулись с JIT-компиляцией. Каждая функция (не только лямбда) при первом выполнении компилируется в нативный код. Каждое последующее выполнение уже не нуждается в компиляции, а значит, происходит значительно быстрее.

Что такое dns-prefetch и x-dns-prefetch-control

Привет. Решил подробнее изучить тему мета-тэгов и наткнулся на такие тэги: Скажите как работают и какую задачу решают. Спасибо.


Ответ

По ссылке детально описано: Предварительная загрузка Кратко - Вы сообщаете браузеру, по каким адресам могут находиться ресурсы Вашей страницы (картики, скрипты), что бы он мог разрезолвить имена сразу. На очень медленном интернете это может сэкономить до 0.2 секунд на каждый запрос.

Что не так в моем коде, и как подтянуть навыки?

Отправил тестовое задание на позицию Android разработчика, но в ответ они написали: После ознакомления с тестовым заданием, мы отметили, что у вас недостаточный уровень знания принципов ООП и принципов построенийAndroid-приложений. Если вы подтянете свой уровень знаний, лучше изучите ООП и каким образом применять его принципы для построения приложений, то мы могли бы вернуться к вопросу рассмотрения вашей кандидатуры в будущем. Я самоучка, учился по книгам, статьям и т.д. , можете опытным глазом посмотреть что в моем коде не так в плане ООП и принципов построения? И как апргрейдить эти навыки? Код на gitHub, т.к. классов не один и не два https://github.com/Vlad161/Products


Ответ

Ответ работодателя очень похож на стандартную отписку, поэтому не стоит воспринимать его буквально. После просмотра вашего проекта (кстати, неплохо было бы написать, что именно от вас хотели, можно выдержку из тестового задания) остались такие замечания:
Имена классов. Обычно имена классов - существительные (JSONReadFromAsset стоило бы назвать JSONAssetReader). К тому же стоит придерживаться какого-то общего стиля именования (два класса-активити заканчиваются на Activity, третий почему-то нет). Скорее всего от вас ждали минимальной реализации MVC. Стоило создать bean для хранения сведений о продукте и добавить уровень абстракции DAO для извлечения данных из файла. Как-то так:

public interface ProductDAO { List getProducts(); }
public class ProductDaoImpl implements ProductDAO { public List getProducts() { // здесь вытаскиваем список продуктов из JSON } }

Таким образом вы бы отделили реализацию получения данных от логики их обработки, получив возможность изменять способ получения данных, не затрагивая основную логику программы.
Насчёт "подтянуть навыки ООП" - читайте Head First Design Patterns и GOF

Как переименовать базу данных?

Доброго времени суток. Как переименовать существующую БД с помощью sql запроса из php?


Ответ

Сделайте бэкап всей исходной БД. RENAME TABLE позволяет переименовывать таблицы из одной БД в другую, при условии, что обе БД находятся на общей файловой системе. Так что надо создать новую БД, переименовать таблицы из старой в новую: CREATE DATABASE db_new;
RENAME TABLE db_old.table1 TO db_new.table1, db_old.table2 TO db_new.table2, ... db_old.tableN TO db_new.tableN ; Проверьте, перенеслись ли таблицы, осталось ли что-то нужное в старой БД. Удалите старую БД: DROP TABLE db_old;

Как вырезать угол блока с помощью CSS3?

Необходимо вырезать все углы блока с помощью CSS3. Как на картинке


Ответ

Этого можно добиться с помощью абсолютного позиционирования прозрачного круглого элемента в углах с тенью по краям. Я использовал сочетание

'ов с отключенной прокруткой, которые содержат 'ы, тени, границы и псевдо-селекторы.
Вот основной HTML и CSS для начала:
a {display:inline-block; width:250px; height:100px; background:#ccc; border:2px solid #000; position:relative; margin:10px;} a div {position: absolute; top: 0; overflow: hidden; width: 15px; height: 100%;} a div:after {content:''; background:#000; width:2px; height:75px; position:absolute; top:12.5px;} a div:first-of-type {left: -14px;} a div:first-of-type:after {left:0;} a div:last-of-type {right: -14px;} a div:last-of-type:after {right:0;} a span {display:block; width:30px; height:30px; background:transparent; position:absolute; bottom:-20px; right:-20px; border:2px solid #000; border-radius:25px; box-shadow:0 0 0 60px #ccc;} a div:first-of-type span {left:-20px;} a div:first-of-type span:first-child {top:-20px;} a div:first-of-type span:last-child {bottom:-20px;} a div:last-of-type span {right:-20px;} a div:last-of-type span:first-child {top:-20px;} a div:last-of-type span:last-child {bottom:-20px;}

Это перевод ответа «Inset border-radius with CSS3».

Красивый вывод var_dump

Что нужно изменить в php.ini, для того чтобы иметь человекочитаемый вывод, например, var_dump и print_r? Сейчас всё выводиться в один ряд, читать массивы с данными нереально.


Ответ

echo '

'; 
var_dump($smth);
print_r($array); 
echo '
';
Обновление
function vardump($var) { echo '
';
  var_dump($var);
  echo '
'; }
Использовать вместо var_dump. ))