C ++将std列表拆分为两个列表

时间:2014-11-01 14:13:16

标签: c++ list std

嘿所以我对c ++有了新的认识,我遇到了这个问题,我想将一个std列表字符串分成两个列表。

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

我猜splice就是我应该用来做这件事,但我无法理解它是如何运作的......

有人可以建议我怎么做吗? 抱歉我的英语不好,感谢大家的帮助。

2 个答案:

答案 0 :(得分: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;

    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

答案 1 :(得分:-1)

  

&#34;我在c ++&#34;

中相当新

对于具有Java或C#体验的用户来说,这是一种常见的误解,std::listList语言的确切行为替代。事实上,对于上面提到的两个,它是{+ 1}}在c ++中。

  

&#34;我想将一半列表拆分为一个列表,另一半列入另一个列表。&#34;

您可以轻松执行此操作,放弃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;
}

LIVE DEMO

如前所述, master = { 1, 2, 3, 4 } firstPart = { 1, 2 } lastPart = { 3, 4 } 的目的完全不同。

如果你真的需要std::list::splice(),你唯一的选择就是迭代和计算。 std::list不支持operations like +