Проблемы с пониманием list.begin() | список.конец() | list<int>::iterator я

void Graph::max_path(){
    
    for(int i=0; i <N; i++){
        cost[i]=0; cam_max[i]=999;
    }
     // Percorre todos os vertices adjacentes do vertice
    int max = 0;
  list<int>::iterator i; 
  for (int a = 0; a < N ; a++){
    int v = ordely[a];
        for (i = adj[v].begin(); i != adj[v].end(); ++i){
          int viz = *i;
          if (cost[viz]<cost[v]+1){
                cost[viz] = cost[v]+1;
                if (cost[viz]>max) max = cost[viz];
        }
      }
    }
  cout << "\nCusto maximo " << max;
}

Мне нужно преобразовать эту программу на C++ в программу на Python... Однако я изо всех сил пытаюсь понять, что означает этот adj[v].begin() внутри цикла for. Может ли кто-нибудь объяснить это мне, пожалуйста?

.begin() и .end() являются функциями-членами контейнеров STL (в вашем случае контейнера списка). Что касается того, что они собой представляют, то это указатели на начало и конец + 1 вашего списка соответственно. list<int>::iterator — это абстракция для выполнения арифметических операций с указателями, предоставленная вам STL. Это отвечает на ваш вопрос?
Gianni Crivello 19.11.2022 16:20

@GianniCrivello в некотором роде так и есть. Но что это за индекс [v] перед .begin()? я никогда не видел этого

BLNFR 19.11.2022 16:37

Покажите, как объявляется adj.

drescherjm 19.11.2022 16:41

@BLNFR, несмотря на ограниченный контекст определения adj, кажется, что вы индексируете adj и получаете доступ к функции-члену .begin() индексированного элемента. Подумайте list из list.

Gianni Crivello 19.11.2022 16:43

@GianniCrivello определяется как list<int> *adj, затем в конструкторе adj = new list<int>[V]. Но, похоже, это действительно список из списка.

BLNFR 19.11.2022 16:56

@BLNFR что такое Ви? В вашем вопросе отсутствует контекст, и вам необходимо предоставить минимальный воспроизводимый пример , чтобы любой из нас мог вам помочь. Также очень рекомендую как диагностировать вашу проблему с помощью отладчика

Gianni Crivello 19.11.2022 17:00
Мутабельность и переработка объектов в Python
Мутабельность и переработка объектов в Python
Объекты являются основной конструкцией любого языка ООП, и каждый язык определяет свой собственный синтаксис для их создания, обновления и...
Другой маршрут в Flask Python
Другой маршрут в Flask Python
Flask - это фреймворк, который поддерживает веб-приложения. В этой статье я покажу, как мы можем использовать @app .route в flask, чтобы иметь другую...
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
Проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
Python PyPDF2 - запись метаданных PDF
Python PyPDF2 - запись метаданных PDF
Python скрипт, который будет записывать метаданные в PDF файл, для этого мы будем использовать PDF ридер из библиотеки PyPDF2 . PyPDF2 - это...
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
5
6
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Begin и end — это итераторы (в частности, указатели), которые используются для перебора контейнера.

Вы можете представить begin как 0 и end как size массива. Так это как for (i = 0; i < size; ++i).

Однако особенность указателей заключается в том, что они являются адресами, поэтому в C++ i < end (где i начинается как begin) больше похож на 0xF550 < 0xF556 (пример), который имеет тот же эффект повторения 6 раз, предполагая, что i увеличивается с каждой итерацией.

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

Я мало знаю о python или вашем классе Graph, но я думаю, что это может помочь вам начать:

def max_path(self) :
for i in range(N) :
    self.cost[i] = 0
    self.cam_max[i] = 999
    max = 0
    for a in range(N) :
        v = self.ordely[a]
        for i in self.adj[v] :
            viz = i
            if self.cost[viz] < self.cost[v] + 1 :
                self.cost[viz] = self.cost[v] + 1
                if self.cost[viz] > max :
                    max = self.cost[viz]
                    print("\nCusto maximo ", max)

Обратите внимание, что итераторы не нужны в версии Python, потому что вы использовали обычный for-loop.

Кстати, в C++ тоже можно было бы использовать for/for-each, код, который вы разместили, излишне сложен и неоптимизирован. Например, первые 2 цикла в вашем коде можно объединить в 1 цикл, потому что они оба имеют одинаковый диапазон, поэтому я оптимизировал их в 1.

Std::list не может использовать указатели в качестве итераторов. Их может использовать только смежный контейнер, например vector или array.

HolyBlackCat 19.11.2022 17:11

@HolyBlackCat О, я совершенно забыл, что существует стандартный тип list, я думал, что это какая-то пользовательская библиотека, которая ведет себя аналогично vector (непрерывная в памяти), поэтому в этом случае я говорил только об итераторах, являющихся адресами.

Beyondo 19.11.2022 17:22

@BLNFR Рад помочь! В любой момент.

Beyondo 19.11.2022 17:24

Другие вопросы по теме