Итераторы в C ++ (stl) против Java, есть ли концептуальная разница?

Используйте moment.js для синтаксического анализа дат:

var caseOne = moment("Jul 8, 2005", "MMM D, YYYY", true).toDate();
var caseTwo = moment("2005-07-08", "YYYY-MM-DD", true).toDate();

Третий аргумент определяет строгий разбор (доступно с 2.3.0). Без него moment.js также может давать неверные результаты.

30
задан JeffV 11 September 2008 в 11:50
поделиться

8 ответов

Да, существует большое концептуальное различие. C++ использует различные "классы" итераторов. Некоторые используются для произвольного доступа (в отличие от Java), некоторые используются для вперед доступа (как Java). В то время как даже другие используются для записи данных (для использования с, скажем, transform).

Посмотрите понятие итераторов в Документация C++ :

  • Входной Итератор
  • Выходной Итератор
  • Вперед Итератор
  • Двунаправленный Итератор
  • Итератор Произвольного доступа

Они намного более интересны и мощны по сравнению с маленькими итераторами Java/C#. Надо надеяться, эти соглашения будут шифроваться с помощью 0x C++ Понятия .

18
ответ дан Frank Krueger 11 September 2008 в 11:50
поделиться
  • 1
    Взял меня некоторое время для понимания красоты этого. Это работает намного лучше, чем попытка применить патч, который часто перестал работать из-за изменений пути к файлу или пробела – Kirby 24 January 2014 в 17:34

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

Это соглашение открывает хост возможностей. Путем алгоритмы работают в C++, они могут все быть применены к подпоследовательностям большего набора. Чтобы заставить такую вещь работать в Java, необходимо создать обертку вокруг существующего набора, который возвращает различный итератор.

Другой важный аспект итераторов был уже упомянут Frank. Существует различное понятие итераторов. Итераторы Java соответствуют C++' входные итераторы, т.е. они - итераторы только для чтения, которые могут только быть увеличены один шаг за один раз и не могут пойти назад.

На другом экстремальном значении, у Вас есть указатели C, которые соответствуют точно C++' понятие итератора произвольного доступа.

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

20
ответ дан Konrad Rudolph 11 September 2008 в 11:50
поделиться
  • 1
    Don' t забывают сбрасывать Ваш файл после него для наблюдения объединенного изменения в git diff, потому что в настоящее время изменение reseted подготавливается и рассматривается отдельно как git diff --staged. – Nakilon 6 November 2015 в 11:33

Как упомянуто, Java и итераторы C# описывают смешанное положение (состояние) - и-диапазон (значение), в то время как итераторы C++ разделяют понятие положения и диапазона. Итераторы C++ представляют, 'откуда я теперь' отдельно, 'куда я могу пойти?'.

Java и итераторы C# не могут быть скопированы. Вы не можете восстановить предыдущее положение. Общие итераторы C++ могут.

Рассматривают этот пример :

// for each element in vec
for(iter a = vec.begin(); a != vec.end(); ++a){
  // critical step!  We will revisit 'a' later.
  iter cur = a; 
  unsigned i = 0;
  // print 3 elements
  for(; cur != vec.end() && i < 3; ++cur, ++i){
      cout << *cur << " ";
  }
  cout << "\n";
}

Щелчок вышеупомянутая ссылка для наблюдения вывода программы.

Этот довольно глупый цикл проходит последовательность (использующий вперед только семантику итератора), печатая каждую непрерывную подпоследовательность 3 элементов точно однажды (и пара более коротких подпоследовательностей в конце). Но предполагая N элементы и элементы M на строку вместо 3, этот алгоритм все еще был бы O (N*M) инкременты итератора и O (1) пространство.

итераторы стиля Java испытывают недостаток в способности сохранить положение независимо. Вы будете или

  • , теряют O (1) пространство, с помощью (например), массив размера M для хранения истории, поскольку Вы выполняете итерации
  • , должен будет пересечь список N времена, делая O (N^2+N*M) время
  • или использовать конкретный Тип массива с функцией членства GetAt, проигрывая genericism и способностью использовать типы контейнера связанного списка.

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

, неспособность сохранить состояние соответствует наиболее тесно входному итератору STL C++, на котором создаются очень немного алгоритмов.

11
ответ дан Jason Plank 11 September 2008 в 11:50
поделиться
  • 1
    Это походит на лучшее решение, но меня все еще don' t понимают почему мы can' t просто выталкивают существующий притон, в то время как у нас есть неподготовленные изменения. Например, было бы хорошо просто работать git stash pop сопровождаемый git stash pop. Возможно, I' m пропавшие без вести чего-то о мерзавце прячут внутренности. – modulitos 4 April 2017 в 18:17

Указатель на элемент массива является действительно итератором в массив.

, Как Вы говорите в Java, итератор имеет больше знания базового контейнера, чем в C++. Итераторы C++ являются общими, и , пара из итераторов может обозначить любой диапазон: это может быть поддиапазоном контейнера, диапазоном по нескольким контейнерам (см. http://www.justsoftwaresolutions.co.uk/articles/pair_iterators.pdf или http://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/zip_iterator.html ), или даже диапазон чисел (см. http://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/counting_iterator.html )

категории итератора определяют то, что Вы можете и не можете сделать с данным итератором.

7
ответ дан Anthony Williams 11 September 2008 в 11:50
поделиться
  • 1
    Если сование второго притона дает конфликты слияния (который является, когда два последовательных выталкивают don' t работа), Вам также нужно git add <conflicted_files> после фиксации конфликтов. – Sameer 12 July 2017 в 19:53

Мне принципиальное различие - то, что Итераторы Java указывают между объектами, тогда как итераторы STL C++ указывают на объекты.

3
ответ дан Douglas Leeder 11 September 2008 в 11:50
поделиться
  • 1
    @Nakilon сослался на это, но я добавлю следующее как шаг 5 (вводимый от project' s корневой каталог): git reset HEAD . – Grant Humphries 10 January 2019 в 21:09

Итераторы C++ являются обобщением понятия указателя; они делают его применимым к более широкому диапазону ситуаций. Это означает, что они могут использоваться, чтобы сделать, такие вещи как определяют произвольные диапазоны.

итераторы Java являются относительно немыми перечислителями (хотя не настолько плохо как C#; по крайней мере, Java имеет ListIterator и может использоваться для видоизменения набора).

2
ответ дан DrPizza 11 September 2008 в 11:50
поделиться
  • 1
    Это является безусловно самым простым если изменения don' t перекрытие. Я чувствую себя глупым должным быть сделать фиксации только для слияния содержания. – Marcelo Diniz 22 December 2013 в 11:06

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

1
ответ дан Marcus Downing 11 September 2008 в 11:50
поделиться
  • 1
    @MarceloDiniz: всегда должна быть фиксация, если содержание изменяется. Не глупый вообще. – siride 22 December 2013 в 16:12

Библиотека C++ (часть, раньше известная как STL) итераторы, разработана, чтобы быть совместимой с указателями. Java, без адресной арифметики с указателями, имел свободу быть более благоприятным для программиста.

В C++ Вы заканчиваете тем, что имели необходимость использовать пару итераторов. В Java Вы или используйте итератор или набор. Итераторы, как предполагается, являются связующим звеном между алгоритмом и структурой данных. Код, записанный для 1,5 + редко, должен упомянуть итераторы, если он не реализует конкретный алгоритм или структуру данных (который у варьироваться большинства программистов нет потребности сделать). Когда Java идет для динамических подмножеств полиморфизма, и т.п. намного легче обработать.

1
ответ дан Tom Hawtin - tackline 11 September 2008 в 11:50
поделиться
  • 1
    При применении притона, поскольку будет работать патч, если притон будет довольно тривиален, но won' t работают, если были промежуточные, нетривиальные пробельные изменения или изменения в путях к файлам – Kirby 24 January 2014 в 17:35
Другие вопросы по тегам:

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