说我有一个带有标准容器的课程:
class Library{
std::vector<Book> books;
public:
void putOnFire(){
books.clear();
}
};
清除容器的常用方法是“清除”,但是大多数代码不符合“STL”,因此许多容器(第三方)可能没有“清除”方法。但是,如果他们有移动语义,我可以使用std :: move right?
void putOnFire(){
auto p = std::move(books); //books cleared when p out of scope
}
这是编写大多数通用的可能代码,这些代码也适用于不具有“clear”方法的STL容器。
答案 0 :(得分:5)
std::move
使移动的对象保持有效但未指定的状态。特别是它可能保持原样,所以虽然这实际上可能与stl的实现有关,但它肯定不适用于所有第三方容器。 (并且在将来由于更新而导致stl的实现发生变化时,可能会在任何时候中断)
答案 1 :(得分:3)
我不推荐这个。首先,它掩盖了意图。使用/*** begin our session ***/
session_start();
$app = new \Slim\Slim(array(
'view' => new \Slim\Views\Twig()
));
$csrfTokenGenerator = function () {
$form_token = md5( uniqid('auth', true) );
$_SESSION['form_token'] = $form_token;
};
$app->get('/login', $csrfTokenGenerator, function() use ($app) {
$app->render('login.twig');
})->name('login');
或c.clear
。没有擦除/删除元素的容器不是合适的动态大小的容器。此外,您提出的解决方案取决于特定容器类型的移动构造函数,它是实现定义的,不必释放内存。
作为最后的手段,我建议使用c.erase(c.begin(), c.end())
代替建议的移动。
答案 2 :(得分:2)
向量可以释放其内存:
void putOnFire()
{
books.clear();
books.shrink_to_fit();
}
如果您正在使用某个不是标准容器的容器,那么您必须查阅其文档以查看它支持的操作。
编写预期具有未知接口的容器的代码是不可能的。