如何解决从 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_ptr
或 std::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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。