реализация BFS с использованием STL в c

#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;