【问题标题】:C++ Merge List Elements in PairsC++ 成对合并列表元素
【发布时间】:2014-03-11 17:58:13
【问题描述】:

我需要成对合并列表元素,合并前两个,然后合并后两个,依此类推,如果最后一个元素没有成对,则保持不变。例如,如果我通过添加对来合并从零到十的数字列表,我会从顶部列表转到下面的底部列表。

0 1 2 3 4 5 6 7 8 9 10

1   5   9   13  15  10

(为了便于阅读,第二个列表中有额外的空白,但它的大小应该是六个,并且它不应该有任何空元素。) 这是一个非常简化的例子;我的实际程序正在使用合并功能

void merge(Obj *a, Obj *b)

在指向对象的指针列表上。

std::list<Obj*> myList;

如何像这样成对地遍历列表?

【问题讨论】:

  • 应该是作业吗?
  • 这个问题很不清楚。你的意思不是合并,你的意思是添加。而std::list&lt;*Obj&gt; 不是有效类型。
  • 不,我正在实现一个配对堆。在我的整数示例中,我添加了它们,但是需要使用合并函数以更复杂的方式合并对象。合并功能实现不相关。我已将 list 更正为 list.
  • 啊,我明白了……好吧,我没有从问题中得到答案

标签: c++ list pointers stl


【解决方案1】:

类似

std::list<*Obj> newList;
std::list<*Obj>::iterator itFirst = myList.begin();
std::list<*Obj>::iterator itSecond = myList.begin();
itSecond++; // move to element 1

for ( ; 
      itFirst != myList.end();
      std::advance(itFirst, 2), std::advance(itSecond, 2) )
{
    newList.push_back(merge(*itFirst, *itSecond));
}

这应该像您在示例中显示的那样合并每对连续元素并将它们填充到一个新列表中。

【讨论】:

  • 这不适用于std::lists。他们没有随机访问迭代器。但是你可以在循环中增加两个迭代器。
  • 如果可能的话,我宁愿继续使用列表,因为我经常添加和删除元素。不幸的是,列表没有有效的随机访问。
  • @juanchopanza 我应该在合并后的每个循环中将两个迭代器递增两次以移动到下一对,还是因为合并而减少递增?
  • @Qaz 如果你想运行双迭代器,你会在 begin() 开始一个,然后在 begin()++ 开始下一个,然后以 2 为步长迭代每个迭代器。第一个将抓取 0 , 2, 4 等,第二个将抓取 1, 3, 5
猜你喜欢
  • 1970-01-01
  • 2020-09-09
  • 2021-06-15
  • 2018-01-15
  • 2016-08-15
  • 2018-04-29
  • 1970-01-01
  • 2017-09-16
  • 2013-09-03
相关资源
最近更新 更多