#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:
Тем не менее, если вам нужно только распечатать 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 выводит список с начала на конец, в то время как второй цикл выводит список с начала на начало.