程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了从 std::vector 中删除元素大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决从 std::vector 中删除元素?

开发过程中遇到从 std::vector 中删除元素的问题如何解决?下面主要结合日常开发的经验,给出你关于从 std::vector 中删除元素的解决方法建议,希望对你解决从 std::vector 中删除元素有所启发或帮助;

我想删除 std::vector 中的所有元素

create table mytable(name varchar(32),createdDate varchar(64));
insert into mytable(name,createdDate) values
('John','20160101 20:36:12'),('Max','20160101 20:37:12'),'20160101 20:38:12'),('John','20160101 20:39:12'),'20160101 20:41:12');
select item1.name,item1.createdDate,item2.createdDate
from mytable item1
join mytable item2
on item1.name = item2.name and
   item1.createdDate < item2.createdDate and
   not exists (
       select 1
       from mytable inneritem
       where inneritem.name <> item1.name and
             inneritem.createdDate > item1.createdDate and 
             inneritem.createdDate < item2.createdDate
   ) and
   not exists (
       select 1
       from mytable inneritem
       where inneritem.name = item1.name and
             inneritem.createdDate < item1.createdDate and
             not exists (
                 select 1
                 from mytable innerinneritem
                 where innerinneritem.name <> item1.name and
                       innerinneritem.createdDate > inneritem.createdDate and 
                       innerinneritem.createdDate < item1.createdDate
             )
   ) and
   not exists (
       select 1
       from mytable inneritem
       where inneritem.name = item1.name and
             inneritem.createdDate > item2.createdDate and
             not exists (
                 select 1
                 from mytable innerinneritem
                 where innerinneritem.name <> item1.name and
                       innerinneritem.createdDate > item2.createdDate and 
                       innerinneritem.createdDate < inneritem.createdDate
             )
   );

有没有更好的方法来做到这一点?

解决方法

std::for_each 可以替代显式循环:

std::for_each(cbs.begin(),cbs.end(),[](Entity *cb){
    delete cb;
});
,

使用共享或唯一指针。这会导致在清除向量时自动删除(或在不清除向量的情况下在向量的析构函数中)。

#include <iostream>
#include <memory>
#include <vector>

class Test
{
private:
    size_t m_index;
public:
    Test(size_t index)
        : m_index(index)
    {
    }

    void PrintIndex()
    {
        std::cout << m_index << std::endl;
    }

    ~Test()
    {
        std::cout << "destructor invoked for " << m_index << std::endl;
    }
};

int main()
{
    std::vector<std::unique_ptr<Test>> v;

    for (size_t i = 0; i < 5; ++i)
    {
        v.emplace_back(new Test(i));
    }

    for (auto& t : v)
    {
        t->PrintIndex();
    }

    //v.clear();

    return 0;
}

至于对注释中提到的每个元素执行其他任意操作:

还有其他方法可以实现这个结果,但没有什么比 ranged for 循环更好的了;恕我直言;毕竟只是 3 行简单的行(加上循环体)。

,

您在评论中澄清说您有一个原始指针向量,并希望删除它们指向的所有对象。

那你是怎么做到的?

你没有!

在 C++ 中,我们不进行手动内存管理(原始 new/delete)。它有问题(任何异常都会使您泄漏内存),容易出错且令人困惑(应该由谁删除对象)。相反,我们使用 RAII。为此,我们有智能指针。因此,使用 std::unique_ptrstd::shared_ptr,一切都会为您正确管理。

它可以是对元素的任何操作,但对所有元素都一样。

像您这样的循环范围是惯用的方法:

for (auto&& elem : vector)
{
    foo(elem);
}
,

您可以使用 clear(); 擦除 std::vector 的所有元素。 clear 删除它的所有元素,erase 可以删除特定元素。

vector<int> myvector;
myvector.push_back(1);
myvector.push_back(2);
myvector.push_back(3);
myvector.push_back(4);
myvector.push_back(5);

// Vector becomes 1,2,3,4,5

myvector.clear();
// vector becomes empty

了解更多信息: https://www.geeksforgeeks.org/vector-erase-and-clear-in-cpp/#:~:text=All%20the%20elements%20of%20the%20vector%20are%20removed%20using%20clear,the%20number%20of%20elements%20removed。

大佬总结

以上是大佬教程为你收集整理的从 std::vector 中删除元素全部内容,希望文章能够帮你解决从 std::vector 中删除元素所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: