假设我有一个包含一些整数的列表,我需要快速将其与自身合并:例如我在该过程之后有{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);
}
有没有其他方法可以做到这一点,但速度要快得多? 感谢
答案 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),但这里不需要。显然,副本仍然需要一个大型列表的时间,但这是不可避免的。