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. Может ли кто-нибудь объяснить это мне, пожалуйста?
@GianniCrivello в некотором роде так и есть. Но что это за индекс [v] перед .begin()? я никогда не видел этого
Покажите, как объявляется adj.
@BLNFR, несмотря на ограниченный контекст определения adj, кажется, что вы индексируете adj и получаете доступ к функции-члену .begin() индексированного элемента. Подумайте list из list.
@GianniCrivello определяется как list<int> *adj, затем в конструкторе adj = new list<int>[V]. Но, похоже, это действительно список из списка.
@BLNFR что такое Ви? В вашем вопросе отсутствует контекст, и вам необходимо предоставить минимальный воспроизводимый пример , чтобы любой из нас мог вам помочь. Также очень рекомендую как диагностировать вашу проблему с помощью отладчика
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 О, я совершенно забыл, что существует стандартный тип list, я думал, что это какая-то пользовательская библиотека, которая ведет себя аналогично vector (непрерывная в памяти), поэтому в этом случае я говорил только об итераторах, являющихся адресами.
@BLNFR Рад помочь! В любой момент.
.begin()
и.end()
являются функциями-членами контейнеров STL (в вашем случае контейнера списка). Что касается того, что они собой представляют, то это указатели на начало и конец + 1 вашего списка соответственно.list<int>::iterator
— это абстракция для выполнения арифметических операций с указателями, предоставленная вам STL. Это отвечает на ваш вопрос?