2017-03-02 57 views
-3

如果我有兩個列表A和B,如何將B的所有元素添加到列表A的開頭,而不「清空」B列表。我基本上只想將B列表的副本轉移到列表的開頭。我正在考慮使用插入,並希望仔細檢查語法。在C++中組合兩個列表

我知道,如果我將它添加到年底將是:

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

所以開頭插入這將是:

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

+1

你嘗試了嗎?當你這樣做,它是否工作,或出了什麼問題? – Yakk

+0

在發佈問題之前,您可能需要查閱[documentation](http://en.cppreference.com/w/cpp/container/list/insert)。 – Galik

回答

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

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