Изменение содержимого std::list

#c #list #stl #iostream #reverse

#c #Список #stl #iostream #изменение

Вопрос:

 class Print 
   {  
   public:
       void PrintAll() {}
   private:
    std::list<int> mylist;
   };
  

Я вижу этот пример вопроса из книги по языку C .
И я хочу распечатать внутренние элементы mylist.
Как это можно сделать, если необходимо изменить mylist, используя библиотеку C STL и используя для вывода результата.

Большое вам спасибо!

Комментарии:

1. Пожалуйста, добавьте код для printAll()

Ответ №1:

std::list<>::reverse() ?

Тем не менее, если вам нужно только распечатать list в обратном порядке, вы можете просто распечатать его, используя list обратные итераторы (полученные с помощью std::list<>::rbegin() и std::list<>::rend() ), а не с помощью list обычных итераторов. Например.:

 // given std::list<int> l;
for (std::list<int>::const_reverse_iterator iter(l.rbegin()), iter_end(l.rend());
        iter != iter_end;
          iter)
{
    std::cout << *iter << 'n';
}
  

Комментарии:

1. std::copy( l.rbegin(), l.rend(), std::ostream_iterator<int>( std::cout, "n" ) );

Ответ №2:

Вы можете использовать reverse() метод в своем списке.

 mylist.reverse();
  

изменит содержимое вашего списка, а затем вы сможете распечатать то же самое, используя итераторы.

 list<int>::iterator it;
cout << "mylist contains:";
for (it=mylist.begin(); it!=mylist.end();   it)
    cout << " " << *it;
  

Вы можете обернуть всю функциональность в свою собственную функцию-член.

Ответ №3:

Вы также можете использовать обратные итераторы, предоставляемые контейнером, например, l.rbegin() и l.rend(), и это приведет к повторению списка в обратном направлении.

Ответ №4:

Пример кода для list::reverse

 // list_reverse.cpp
// compile with: /EHsc
#include <list>
#include <iostream>

int main( ) 
{
   using namespace std;
   list <int> c1;
   list <int>::iterator c1_Iter;

   c1.push_back( 10 );
   c1.push_back( 20 );
   c1.push_back( 30 );

   cout << "c1 =";
   for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter   )
      cout << " " << *c1_Iter;
   cout << endl;

   c1.reverse( );
   cout << "Reversed c1 =";
   for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter   )
      cout << " " << *c1_Iter;
   cout << endl;
}
  

И результат будет

c1 = 10 20 30 Обращенный c1 = 30 20 10

Ответ №5:

итератор просто указывает на текущий элемент в списке. Итак, если мы напишем цикл for, идущий от конца к началу, мы можем распечатать список в обратном порядке. в коде, приведенном ниже:

     #include <iostream>
    #include <list>

    using namespace std;

    int main()
    {
       std::list<int> ii;
       ii.push_back(1);
       ii.push_back(2);
       ii.push_back(3);
       ii.push_back(4);
       ii.push_back(5);
       for (std::list<int>::iterator it = (ii.begin()); it != (ii.end()) ;   it)
       {
           cout << (*it) << " ";
       }
       cout << endl;
       for (std::list<int>::iterator it = (--ii.end()); it != (--ii.begin()) ; it--)
       {
           cout << (*it) << " ";
       }
       return 0;
    }
  

Первый цикл for выводит список с начала на конец, в то время как второй цикл выводит список с начала на начало.