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