在C ++中删除Vector及其内容的有效方法

时间:2016-02-04 01:55:51

标签: c++ vector

我有vector<Mat> images向量。 我想删除矢量及其内容。 我知道一些方法。 我想知道哪一个更有效。 他们是

(1)images.erase();
(2)images.clear();
   vector<Mat>().swap(images);
(3)for(unsigned int l = 0; l < images.size(); l++){
        images[l].release();
   }

由于

2 个答案:

答案 0 :(得分:1)

你要求最“有效”。你有可能意味着“有效”。最有效的方法是在大多数情况下做你想做的事情,清除那个向量。

这就是clear()方法,因为erase()会增加对项目的要求,即它不太普遍适用。

[1] cppreference.com关于erase
  

T必须符合MoveAssignable的要求。

可能Mat移动可分配或可复制,但如果不是,那么您就不能使用erase

方法3,循环遍历所有向量项并使用特定于项的方式将每个项返回到可破坏的nullstate / emptystate,显然效率最低,因为它仅适用于具有nullstates / emptystates的项类型。请注意,由于示例中未包含该内容,因此您需要在此之后调整矢量大小。

如果不是有效而是真正意味着高效,那么这一切都取决于类型Mat,即编译器的{{1}实现},编译器选项,程序运行的环境等等那么你没有办法,只能衡量。测量的一个好结果可能是您发现不需要特定的优化,因此您最有可能只使用std::vector作为最清晰的方式,这就是&#39; s通常最重要的。 ; - )

[1] At(http://en.cppreference.com/w/cpp/container/vector/erase)。 功能

答案 1 :(得分:0)

清除将是最快的,因为它会保留分配的内存,所以,如果你打算重用那个向量,这是最好的选择。

虽然交换技巧会强制向量释放内存,这在技术上应该更慢。

当然,如果Mat类有一个编写良好的析构函数,你只能使用swap或clear,否则你需要循环释放它们,然后清除向量。