#c #arrays #stl #iterator
#c #массивы #stl #итератор
Вопрос:
Я пытаюсь написать код для BFS на c с использованием STL. Это раздел кода, с которым у меня возникли проблемы
std::list<int> li=*i;
for (std::list<int>::iterator iter=li.begin(); iter!=li.end(); iter)
{
if (arr[iter]==0)
{
myQ.push(iter);
arr[iter]=1;
Здесь arr — это массив, в котором хранится, видел я узел или нет.я получаю сообщение об ошибке
«Нет соответствия для оператора arr[] в arr[iter]
Комментарии:
1. Что такое определение
arr
?2. Вопрос заключается в том,
arr
что вы не опубликовали определениеarr
.3. iter — это итератор, то есть своего рода указатель, а не целое число. Это вызовет проблемы в вашем arr[], если только оно не определено как map.
4.
std::list<int> li=*i;
при этом копируется весь список.
Ответ №1:
iter — это итератор, то есть своего рода указатель, а не целое число. Вот почему arr[] не работает, потому что он ожидает целое число.
Вместо этого попробуйте использовать arr[*iter]
, и ваш поиск в ширину позволит успешно избежать циклов.
Пожалуйста, обратите внимание, что у вас такая же потенциальная проблема с вашим push (iter), если предполагается, что MyQ также содержит узлы.
Вы могли бы еще больше улучшить свой дизайн, определив arr как набор вместо массива / вектора. Тогда ваше условие будет выглядеть следующим образом:
if (arr.count(*iter) == 0) {
myQ.push_back(*iter);
arr.insert(*iter); // works for int, but also other data types
}
Ответ №2:
Я отвечаю, предполагая arr в целочисленном массиве. К любому элементу массива можно получить доступ только по его целочисленному индексу, но не по адресу целочисленного индекса. Здесь iter — это указатель, который может хранить адрес целого числа.
Таким образом, вы должны использовать ‘*’ для извлечения значения, хранящегося по адресу, чтобы получить целочисленное значение.
Поэтому измените array[iter] на array[*iter]..
Надеюсь, это решит вашу проблему.
Ответ №3:
Здесь iter — это итератор, который является указателем на список, поэтому для доступа к его значению вы должны написать * iter (значение доступа, на которое он указывает) вместо iter (это ссылка).
Попробуйте это
std::list<int> li=*i;
for (std::list<int>::iterator iter=li.begin(); iter!=li.end(); iter)
{
if (arr[*iter]==0)
{
myQ.push(*iter);
arr[*iter]=1;