在C ++中组合两个列表

时间:2017-03-02 16:01:56

标签: c++ list insert

如果我有两个列表A和B,如何将B的所有元素添加到列表A的开头,而不是"清空" B列表。我基本上只想把B列表的副本转移到A列表的开头。我正在考虑使用insert并希望仔细检查语法。

我知道如果我将它添加到最后它将是:

A.insert(A.end(), B.begin(), B.end());

所以在开头插入它会是:

A.insert(A.begin(), B.begin(), B.end());

...

2 个答案:

答案 0 :(得分:0)

制作要追加的列表的临时副本而不会清空,然后将临时列表拼接成原始列表。这是一个例子。

#include <iostream>
#include <list>
#include <vector>

int main ()
{
  std::list<int> mylist;
  std::list<int>::iterator it;

  std::list<int> otherList;
  std::list<int> combinedList;

  // set some initial values:
  for (int i=1; i<=5; ++i) mylist.push_back(i); // 1 2 3 4 5
  for (int i=6; i<=10; i++) otherList.push_back(i); // 6 7 8 9 10

  std::list<int> temp = otherList;
  combinedList = mylist;
  it = combinedList.begin();

  combinedList.splice(it, temp);

  std::cout << "mylist contains:";
  for (it=combinedList.begin(); it!=combinedList.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  std::cout<<"orignal appended list:"<<std::endl;
  for(it=otherList.begin(); it!=otherList.end(); ++it)
    std::cout<<' '<<*it;
  std::cout<<'\n';

  return 0;
}

http://ideone.com/e.js/Ol6Wk1

答案 1 :(得分:0)

这可以用一行实现,使用列表可以双向迭代的事实。

copy(A.rbegin(), A.rend(), front_inserter(B));

完整示例(列表构造函数和打印代码C++11,但答案为C++03有效):

#include <list>
#include <iterator>
#include <algorithm>
#include <iostream>

int main() {
  // Create lists
  std::list<char> A = {'a','b'};
  std::list<char> B = {'c','d'};

  // Insert A at the beginning of B
  copy(A.rbegin(), A.rend(), front_inserter(B));

  // Print result
  for(auto c : B)
    std::cout << c;
  std::cout << "\n";
  return 0;
}