CF
Cause Fiction17 жовтня 2020 р. 13:35

Маленький вопрос для знатоков list

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

list mylist [10];

mylist[1].push_back(13); // почему это вообще работает?
mylist[1].push_back(15);

for (int i = 0; i <10; i++)
{
cout « i;
for (auto x : mylist[i]) { cout « " —> " « x; }
cout « endl;
}

Скрин с результатом. Я не понимаю, почему в list работает индексация, если пишут, что она не работает. И почему мы можем сделать список списков из одномерного списка.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

6
Дмитрий
  • 18 жовтня 2020 р. 06:29
  • (відредаговано)

Имелось ввиду это?

std::list<int> mylist[10]

Вы создаете 10 пустых листов и по [1] обращаетесь к массиву из листов (тут может быть имассив int и любой другой массив), а не к элементу листа.
А тут:

for (auto x : mylist[i]) { cout « " —> " « x; }

вы уже обращаетесь непосредственно к элементам листа.

    ИП
    • 19 жовтня 2020 р. 01:49

    В данном примере строчка
    list mylist [10]; (правильнее будет std::list mylist [10])
    создает клсассический массив на 10 элементов, елементами являются std::list
    В результате получаем 10 листов
    Строчки mylist[1].push_back(13); mylist[1].push_back(15); добавляют к одному листу (с инксом 1) сначала значение 13, а потом 15. Соответствующие значения предсказуемо выводятся экран.

    Не совсем понятен вопрос "почему одномерный list можно таким образом использовать как двумерный, и почему это вообще работает?", а какое поведение врообще ожидалось?
    Или напишите какое поведение Вам нужно, а я приведу пример кода с пояснениями "как оно работает..."

      ДК
      • 19 жовтня 2020 р. 03:44

      Почему вы считаете, что односвязный список не может быть х-мерным?
      Я когда-то давно писал свой List:

      template<class T>
      class List
      {
      public:
          List() :
              _head(nullptr), _size(0) {}
          ~List () { clear(); }
      
          void clear();
          void push_back(const T&);
          void push_front(const T&);
          void pop_front();
          void pop_back();
          void show();
          void remove_at(const size_t);
          void insert(const T&, const size_t);
          size_t size() { return this->_size; }
      
          T& operator[](const size_t);
      
      private:
      
          template<class T2>
          class Node
          {
          public:
              Node* _pnext;
              T2 _data;
      
              Node(T2 data = T(), Node* pnext = nullptr) :
                  _data(data), _pnext(pnext) {}
          };
      
          Node<T>* _head;
          size_t _size;
      };
      
      template<class T>
      T& List<T>::operator[](const size_t index)
      {
          if(index >= 0 && index < _size)
          {
              size_t counter = 0;
              Node<T>*current = _head;
      
              while(current != nullptr)
              {
                  if(counter == index)
                      return current->_data;
                  current = current->_pnext;
                  ++counter;
              }
          }
      }
      
      template<class T>
      void List<T>::push_front(const T& el)
      {
          _head = new Node<T>(el, _head);
          ++_size;
      }
      
      template<class T>
      void List<T>::insert(const T& el, const size_t index)
      {
          if(index > 0 && index < _size)
          {
              Node<T>* current = _head;
              for(size_t i = 0; i < index - 1; ++i)
                  current = current->_pnext;
              current->_pnext = new Node<T>(el, current->_pnext);
              ++_size;
          }
          else if(index == 0) {
              push_front(el);
          }
      }
      
      template<class T>
      void List<T>::clear()
      {
          while(_size)
              pop_front();
      }
      
      template<class T>
      void List<T>::pop_back()
      {
          remove_at(_size - 1);
      }
      
      template<class T>
      void List<T>::remove_at(const size_t _index)
      {
          if(_index > 0 && _index < _size)
          {
              Node<T>* previous = _head;
              for(size_t i = 0; i < _index - 1; ++i)
                  previous = previous->_pnext;
              Node<T>* toDelete = previous->_pnext;
              previous->_pnext = toDelete->_pnext;
              delete toDelete;
              --_size;
          }
          else if(_index == 0)
              pop_front();
      }
      
      template<class T>
      void List<T>::show()
      {
          if(_size > 0)
          {
              size_t counter = 0;
              Node<T>* current = _head;
              do
              {
                  std::cout << current->_data << " ";
                  current = current->_pnext;
                  ++counter;
              } while(current != nullptr);
          }   
      }
      
      template<class T>
      void List<T>::pop_front()
      {
          if(_size > 0)
          {
              Node<T>* temp;
              temp = _head;
              _head = _head->_pnext;
              delete temp;
              --_size;
          }
      }
      
      template<class T>
      void List<T>::push_back(const T& el)
      {
          if(_head != nullptr)
          {
              Node<T>* current = this->_head;
              while(current->_pnext != nullptr)
                  current = current->_pnext;
              current->_pnext = new Node<T>(el);
          }
          else {
              _head = new Node<T>(el);
          }
          ++_size;
      }
      

      В Qt push_back просто вызывает append, там такой код:

      inline void QList<T>::append(const QList<T> &t)
      {
          *this += t;
      }
      
        ИП
        • 19 жовтня 2020 р. 04:15
        • (відредаговано)

        Ни кто не запрещает сделать 2-х мерный или даже трехмерный лист, например так

        #include <iostream>
        #include <list>
        int main()
        {
            std::list<std::list<int>> lmatrix = {{2, 5 , 4, 77, 88}, {1, 11}, {4, 8, 9}, {2, 45, 65, 89}};
            std::list<int> &r = lmatrix.front();
            r.push_back(100);
            for (const std::list<int> & row : lmatrix)
            {
                for (const int & i : row)
                {
                    std::cout << i << " ";
                }
                std::cout << std::endl;
            }
            return 0;
        }
        
          CF
          • 19 жовтня 2020 р. 14:48

          Спасибо, я уже понял, в чем было дело) меня запутали квадратные скобки и название простого массива "mylist". Я думал, что [10] это размер листа, а размер листа задается в круглых скобках. Да и в принципе не часто увидишь, что-бы создавали классический массив хранящий листы, еще и с названием mylist вместо arr.

            ДК
            • 20 жовтня 2020 р. 03:13
            • (відредаговано)

            к элементам списка нельзя через кв скобки обращаться, тк его элементы в памяти не расположены последовательно. Для этого существует метод at(index). Для вектора и обычного массива обращение через кв скобки безопасно.

              Коментарі

              Only authorized users can post comments.
              Please, Log in or Sign up
              sf

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:90бали,
              • Рейтинг балів8
              МВ

              Qt - Тест 001. Сигналы и слоты

              • Результат:68бали,
              • Рейтинг балів-1
              ЛС

              C++ - Тест 001. Первая программа и типы данных

              • Результат:53бали,
              • Рейтинг балів-4
              Останні коментарі
              A
              ALO1ZE19 жовтня 2024 р. 05:19
              Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь Максимов05 жовтня 2024 р. 04:51
              Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas505 липня 2024 р. 08:02
              QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              k
              kmssr08 лютого 2024 р. 15:43
              Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
              АК
              Анатолий Кононенко04 лютого 2024 р. 22:50
              Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
              Тепер обговоріть на форумі
              J
              JacobFib17 жовтня 2024 р. 00:27
              добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
              ИМ
              Игорь Максимов03 жовтня 2024 р. 01:05
              Реализация навигации по разделам Спасибо Евгений!
              JW
              Jhon Wick01 жовтня 2024 р. 12:52
              Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
              КГ
              Кирилл Гусарев27 вересня 2024 р. 06:09
              Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
              F
              Fynjy22 липня 2024 р. 01:15
              при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

              Слідкуйте за нами в соціальних мережах