【问题标题】:Move the first element to the end of the forward_list将第一个元素移动到 forward_list 的末尾
【发布时间】:2018-12-10 03:29:58
【问题描述】:

我知道 std::forward_list 是一个单链表。我想知道如何将第一个元素(头)移动到 forward_list 的末尾。没有副本或创建新节点!

我尝试了以下方法:

std::forward_list<int> l2 = {10,11,12};
auto beginIt = l2.begin();
beginIt = std::next(beginIt);
l2.splice_after(l2.end(),l2,l2.begin(),beginIt); 

for(int n : l2)
    std::cout << n << ' ';
std::cout << '\n';

但它不起作用。有没有办法做到这一点?

【问题讨论】:

  • @KenY-N,这里没有 push_back 函数。
  • 但要求相同,找到列表中的最后一个元素为l2.end() 是在末尾之后的一个。
  • @KenY-N:在这种情况下使用相同的 forward_list,没有创建节点。
  • 链接的问题是这个问题的一部分答案,因为要正确执行移动,您需要一个指向最后一个元素的迭代器。但对这个问题的正确答案应该解释为什么,以及如何处理它。

标签: c++ c++11


【解决方案1】:

出于您的目的,splice_after 需要一个指向最后一个元素的迭代器。也就是说,end() 之前的元素。没有便宜的方法可以得到这个:

auto pos = l2.begin();
while(std::next(pos) != l2.end()) ++pos;

然后,对于单个元素,splice_after 要求一个迭代器指向之前该元素。对于第一个元素,即before_begin()

l2.splice_after(pos, l2, l2.before_begin()); 

【讨论】:

  • 如果我们在splice_after 之前使用auto before_end=l2.begin();,我们会在最后一个元素上获得迭代器。所以下次不用while循环就可以使用了。我想得到这种行为。谢谢。
【解决方案2】:

你可以使用rotate:

std::rotate(l.begin(), std::next(l.begin()), l.end());

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多