程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了优化:指针的vector.erase()大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决优化:指针的vector.erase()?

开发过程中遇到优化:指针的vector.erase()的问题如何解决?下面主要结合日常开发的经验,给出你关于优化:指针的vector.erase()的解决方法建议,希望对你解决优化:指针的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,请注明来意。
标签: