CF
Cause FictionҚаз. 17, 2020, 1: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, 6:29 Т.Ж.
  • (өңделген)

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

std::list<int> mylist[10]

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

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

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

    ИП
    • Қаз. 19, 2020, 1: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, 3: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, 4: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, 2:48 Т.Қ.

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

            ДК
            • Қаз. 20, 2020, 3:13 Т.Ж.
            • (өңделген)

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

              Пікірлер

              Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
              Кіріңіз немесе Тіркеліңіз
              OI
              • Ora Iro
              • Жел. 24, 2024, 6:38 Т.Ж.

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

              • Нәтиже:40ұпай,
              • Бағалау ұпайлары-8
              AD

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

              • Нәтиже:50ұпай,
              • Бағалау ұпайлары-4
              m
              • molni99
              • Қаз. 26, 2024, 1:37 Т.Ж.

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

              • Нәтиже:80ұпай,
              • Бағалау ұпайлары4
              Соңғы пікірлер
              ИМ
              Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
              Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              Evgenii Legotckoi
              Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
              Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
              A
              ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
              Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
              Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas5Шілде 5, 2024, 11:02 Т.Ж.
              QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              Енді форумда талқылаңыз
              Evgenii Legotckoi
              Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
              t
              tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
              google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
              NSProject
              NSProjectМаусым 4, 2022, 3:49 Т.Ж.
              Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
              9
              9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

              Бізді әлеуметтік желілерде бақылаңыз