2014-11-01 120 views
-3

嘿所以我相當新的進入c + +和我遇到了這個問題,我想將一個std列表的字符串拆分成兩個列表。C++將std列表分爲兩個列表

例如:list(1,2,3,4) - >list1(1,2) & list2(3,4)

我猜splice就是我應該使用這一點,但我不明白它是如何工作在所有...

可有人請諮詢我這個怎麼做?
對不起,我的英語不好,謝謝你幫助大家。

+0

那些是不是字符串的整數列表 – P0W 2014-11-01 14:15:34

+2

好吧,['std :: list :: splice'](http://en.cppreference.com/w/cpp/container/list/splice)cppreference中有一個例子。 com文檔。 – 2014-11-01 14:16:45

+1

分裂的標準是什麼?只是位置? – 2014-11-01 14:18:16

回答

0

「我有理由新成C++」

這是用戶使用Java或C#經驗,未來的一個普遍的誤解,認爲std::list是在他們的語言的確切行爲替代的List。實際上對於提到的兩個,它在C++中是std::vector

「我想將列表的一半分成一個列表,另一半列入另一列表。

您可以輕鬆地做到這一點,放棄std::list,並切換到std::vector如果可能的話:

#include <iostream> 
#include <vector> 

void print(const std::string name, const std::vector<int>& v) { 
    std::cout << name << " = { "; 
    bool first = true; 
    for(auto i : v) { 
     if(!first) { 
      std::cout << ", "; 
     } 
     else { 
      first = false; 
     } 
     std::cout << i; 
    } 
    std::cout << " }" << std::endl; 
} 

int main() { 
    std::vector<int> master { 1, 2, 3, 4}; 

    size_t halfPos = master.size()/2; 

    if(halfPos > 0) { 
     std::vector<int> firstPart(master.begin(),master.begin() + halfPos); 
     std::vector<int> lastPart(master.begin() + halfPos,master.end()); 

     print("master",master); 
     print("firstPart",firstPart); 
     print("lastPart",lastPart); 
    } 
    return 0; 
} 

輸出:

master = { 1, 2, 3, 4 } 
firstPart = { 1, 2 } 
lastPart = { 3, 4 } 

LIVE DEMO

如上所述std::list::splice()具有完全不同的目的。

如果你真的需要有一個std::list,你唯一的選擇是迭代和計數。 std::list::iterator不支持operations like +

+1

是的,我第一次使用矢量,所以改回np哈哈,謝謝你的偉大答案。 – ForkInPepsi 2014-11-01 14:58:07

1

嘗試使用以下

#include <iostream> 
#include <list> 
#include <string> 
#include <iterator> 

int main() 
{ 
    std::list<std::string> lst1 = { "1", "2", "3", "4" }; 

    for (const auto &s : lst1) std::cout << s << ' '; 
    std::cout << std::endl; 

    std::cout << std::endl; 

    std::list<std::string> lst2; 
    lst2.splice(lst2.begin(), 
       lst1, 
       lst1.begin(), 
       std::next(lst1.begin(), lst1.size()/2)); 

    for (const auto &s : lst2) std::cout << s << ' '; 
    std::cout << std::endl; 

    for (const auto &s : lst1) std::cout << s << ' '; 
    std::cout << std::endl; 
    return 0; 
} 

輸出是

1 2 3 4 

1 2 
3 4 

另一種方法

#include <iostream> 
#include <list> 
#include <string> 
#include <iterator> 

int main() 
{ 
    std::list<std::string> lst1 = { "1", "2", "3", "4" }; 

    for (const auto &s : lst1) std::cout << s << ' '; 
    std::cout << std::endl; 

    auto middle = std::next(lst1.begin(), lst1.size()/2); 

    std::list<std::string> lst2(lst1.begin(), middle); 

    std::list<std::string> lst3(middle, lst1.end()); 

    for (const auto &s : lst2) std::cout << s << ' '; 
    std::cout << std::endl; 

    for (const auto &s : lst3) std::cout << s << ' '; 
    std::cout << std::endl; 
    return 0; 
} 

輸出是

1 2 3 4 
1 2 
3 4