我想创建一个函数,如果它们匹配某个条件,则将项目从一个STL列表移动到另一个STL列表.
这段代码不是这样做的.迭代器很可能被erase()函数无效并导致问题:
for(std::list<MyClass>::iterator it = myList.begin(); it != myList.end(); it++)
{
if(myCondition(*it))
{
myOtherList.push_back(*it);
myList.erase(it);
}
}
Run Code Online (Sandbox Code Playgroud)
那么有人可以提出更好的方法来做到这一点吗?
sth*_*sth 34
std::list<MyClass>::iterator it = myList.begin();
while (it != myList.end())
{
if(myCondition(*it))
{
myOtherList.push_back(*it);
it = myList.erase(it);
}
else
{
++it;
}
}
Run Code Online (Sandbox Code Playgroud)
STL列表有一个有趣的特性:该splice()
方法允许您破坏性地将元素从一个列表移动到另一个列表.
splice()
以恒定时间运行,不复制元素或执行任何免费的商店分配/解除分配.请注意,两个列表必须是相同的类型,并且它们必须是单独的列表实例(而不是对同一列表的两个引用).
以下是您可以使用的示例splice()
:
for(std::list<MyClass>::iterator it = myList.begin(); it != myList.end(); ) {
if(myCondition(*it)) {
std::list<MyClass>::iterator oldIt = it++;
myOtherList.splice(myOtherList.end(), myList, oldIt);
} else {
++it;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14548 次 |
最近记录: |