大佬教程收集整理的这篇文章主要介绍了优化:指针的vector.erase(),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个关于删除动态指针向量和优化的问题。
这是我的代码。它检查元素是否必须设置为 nullptr,然后删除所有这些元素。
for (auto* el : elements)
{
if (el != 0)
// do something
else
el = nullptr;
}
elements.erase(std::remove(elements.begin(),elements.end(),nullptr),elements.end());
此操作的复杂性对机器来说是否繁重? 如果是,那么是否有更好的方法并且值得?因为,在这里,索引顺序的保存对我来说并不重要。
谢谢!
这个操作对机器来说复杂吗?
成本有点高,但不会比之前的操作多多少。实际上,ggplot(diamonds,aes(carat,pricE)) + geom_point(size=0.3) +
stat_sumMary_bin(geom='errorbar',color='red',bins=12,width=0.001) +
stat_sumMary_bin(geom='point',size=3,shape=5,bins=12) +
geom_smooth(method='lm',color='green') +
theme_classic()
通常会检查每个项目的值,如果需要删除一个项目,算法会将右侧的项目移动到当前分析的项目上。 remove
通常相对便宜,因为它只是调整向量的大小以跳过最后的剩余垃圾(通常没有任何复制或重新分配)并调用丢弃项目的析构函数(只有当它们很多并且析构函数是非平凡的)。此操作可能与前一个操作一样昂贵。
如果是,那么是否有更好的方法并且值得?因为,在这里,索引顺序的保存对我来说并不重要。
是的,这是可能的:您可以使用经典循环遍历数组并交换当前项目与末尾之一以丢弃它。您需要维护一个从结尾移动到开头的 erase
迭代器。当到达结束迭代器时,循环停止。请注意,来自末尾的交换项也应由您的谓词检查。
或者,您可以在此算法中使用 std::partition
执行非常相似的工作并且更简单:它将验证给定条件的项目放在左侧,然后将另一个放在正确的部分。然后您可以调整数组大小以移除不需要的右侧部分。
end
应该比其他基于交换的方法效率稍低,因为它必须保持双方的一致性,因此只有在需要删除大量项目时才有效。
这是一个带有 std::partition
的(未经测试的)示例:
std::partition
以上是大佬教程为你收集整理的优化:指针的vector.erase()全部内容,希望文章能够帮你解决优化:指针的vector.erase()所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。