如果我有兩個列表A和B,如何將B的所有元素添加到列表A的開頭,而不「清空」B列表。我基本上只想將B列表的副本轉移到列表的開頭。我正在考慮使用插入,並希望仔細檢查語法。在C++中組合兩個列表
我知道,如果我將它添加到年底將是:
A.insert(A.end(), B.begin(), B.end());
所以開頭插入這將是:
A.insert(A.begin(), B.begin(), B.end());
?
如果我有兩個列表A和B,如何將B的所有元素添加到列表A的開頭,而不「清空」B列表。我基本上只想將B列表的副本轉移到列表的開頭。我正在考慮使用插入,並希望仔細檢查語法。在C++中組合兩個列表
我知道,如果我將它添加到年底將是:
A.insert(A.end(), B.begin(), B.end());
所以開頭插入這將是:
A.insert(A.begin(), B.begin(), B.end());
?
在不清空的情況下創建要添加的列表的臨時副本,然後將臨時列表拼接到原始列表中。這裏是例子。
#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;
}
,可以用一條線來實現,使用列表可以迭代左右逢源的事實。
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;
}
你嘗試了嗎?當你這樣做,它是否工作,或出了什麼問題? – Yakk
在發佈問題之前,您可能需要查閱[documentation](http://en.cppreference.com/w/cpp/container/list/insert)。 – Galik