Почему push_back или push_front делают недействительным итераторы двухсторонней очереди?

Как насчет удаления атрибута onclick и добавления идентификатора:

<input type="image" src="btn.png" alt="" id="img-clck" />

И вашего сценария:

$(document).ready(function(){
    function codeAddress() {
        var address = document.getElementById("formatedAddress").value;
        geocoder.geocode( { 'address': address}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                map.setCenter(results[0].geometry.location);
            }
        });
    }
    $("#img-clck").click(codeAddress);
});

Таким образом, если вам нужно изменить имя функции или что-то еще не нужно трогать HTML.

25
задан rlbond 26 May 2009 в 22:23
поделиться

5 ответов

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

Итак, хотя легко увидеть, как реализовать deque так, что он дает желаемую гарантию [*], это не единственный способ сделать это.

[*] Итераторы имеют ссылку на элемент, а также ссылку на блок, в котором он находится, чтобы они могли продолжить движение вперед / назад от концов блока, когда достигнут их. Плюс я предполагаю ссылку на саму двухстороннюю очередь, так что оператор + может быть постоянным во времени, как и ожидалось для итераторов с произвольным доступом - следование цепочке ссылок от блока к блоку недостаточно.

]
18
ответ дан 28 November 2019 в 20:49
поделиться

Что еще интереснее, так это то, что push_back и push_front будут ] not аннулирует любые ссылки на элементы двухсторонней очереди. Недействительными должны считаться только итераторы

. Насколько мне известно, в стандарте не указано, почему. Однако, если бы итератор был реализован, который знал о своих непосредственных соседях - как список - этот итератор стал бы недействительным, если бы он указывал на элемент, который был как на краю двухсторонней очереди, так и на краю блока.

14
ответ дан 28 November 2019 в 20:49
поделиться

Главное - не делать никаких предположений, просто относиться к итератору так, как будто он будет признан недействительным.

Даже если он сейчас работает нормально, более поздняя версия компилятора или компилятора для другой платформы может появиться и сломаться ваш код. Или же коллега может прийти и решить преобразовать вашу двухстороннюю очередь в векторный или связанный список.

6
ответ дан 28 November 2019 в 20:49
поделиться

Даже когда вы выделяете фрагменты, вставка приведет к перераспределению этого конкретного фрагмента, если места недостаточно (как в случае с векторами).

2
ответ дан 28 November 2019 в 20:49
поделиться

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

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

Наверное, невозможно сказать, что одна техника строго лучше другой для всех пользователей во всех ситуациях. Вот почему стандарт дает разработчикам некоторую свободу выбора.

1
ответ дан 28 November 2019 в 20:49
поделиться
Другие вопросы по тегам:

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