如何与自己快速合并c ++列表

时间:2015-04-01 08:25:21

标签: c++ visual-studio list

假设我有一个包含一些整数的列表,我需要快速将其与自身合并:例如我在该过程之后有{1,2,3}我希望列表为{1,2,3,1} ,2,3} 这些版本可以做到,但是当列表大小足够大(10 ^ 6)

时,这个版本太慢了
    list< int > l;    //l got some integers here         
    list< int > l_copy = l;

    while (l_copy.size() > 0)
    {
        l.push_back(l_copy.front());
        l_copy.pop_front();
    }

    //another version but still slow i think
    size_t size = l.size();
    for (list<int>::iterator it = l.begin(); size--; ++it)
    {
        l.push_back(*it);
    }

有没有其他方法可以做到这一点,但速度要快得多? 感谢

1 个答案:

答案 0 :(得分:3)

您可以使用std::list::splice

list<int> l;
list<int> l_copy = l;    
l.splice (l.end(), l_copy);

splice的那个版本保证在标准的恒定时间内工作(n4296中的§23.3.5.5/ 6)。它只需将第一个列表的末尾指向另一个列表的开头即可。还有另一个版本的splice,它使用的迭代器范围为O(n),但这里不需要。显然,副本仍然需要一个大型列表的时间,但这是不可避免的。