反转std::列表的内容

Reversing the contents of an std::list

本文关键字:列表 std 反转      更新时间:2023-10-16
class Print 
   {  
   public:
       void PrintAll() {}
   private:
    std::list<int> mylist;
   };

我从一本c++语言书中看到这个例子问题。我想打印mylist的内部元素。如果mylist需要反转,如何使用c++ STL库并使用来输出结果?

非常感谢!

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';
}

您可以在列表中使用reverse()方法。

mylist.reverse();

将反转列表的内容,然后可以使用迭代器打印相同的内容。

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

你可以把所有的功能包装在你自己的成员函数中。

您也可以使用容器提供的反向迭代器,例如l.rbegin()和l.rend(),它们将向后遍历列表。

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

迭代器直接指向列表中的当前元素。因此,如果我们写一个从end到begin的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循环从前到后打印列表,第二个for循环从后到前打印列表。