gpt4 book ai didi

c++ - 使用作用域 queue::swap 清空 std::queue 是否违反任何规则?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:56 27 4
gpt4 key购买 nike

我有很多使用队列的情况,队列的大小可以增长到数百个。不幸的是,如果有必要,没有清空队列的一次性解决方案。我想知道是否使用作用域队列进行交换,然后让作用域队列被销毁,是否会破坏任何内存分配/管理规则?

以下片段是我所提议的示例。似乎有效,如果长时间使用多次,则不确定结果。

#include <cstdlib>
#include <iostream>
#include <queue>
int
main()
{
std::queue<int> foo;
foo.push(10);
foo.push(20);
foo.push(30);
std::cout << "size of before foo: " << foo.size() << '\n';

{
std::queue<int> bar;
swap(foo, bar);
}
std::cout << "size of after foo: " << foo.size() << '\n';
return 0;
}

最佳答案

您的代码没问题。 swap 将使 foo 成为默认构造的 std::queue 并且当 bar 在范围末尾被销毁时它将释放 foo 正在使用的内存。由于您没有使用 newdelete 没有问题,因为 std::queue “做正确的事”( RAII 类型是一件很棒的事情)

成功了

std::queue<int>{std::move(foo)}; // move foo into a temporary that is immediately destroyed to release the storage

但您的方法为您提供了关于foo 状态的更强保证。您的方法将 foo 保留在默认构造状态,而上述方法将其保留在有效但未指定的状态。


另一种选择是使用 Is there a way to access the underlying container of STL container adaptors? 中提供的解决方案之一。从 foo 获取底层容器并对其调用 clear。看起来像

#include <cstdlib>
#include <iostream>
#include <queue>

// function from https://stackoverflow.com/a/29325258/4342498 by jxh: https://stackoverflow.com/users/315052
template <class ADAPTER>
typename ADAPTER::container_type & get_container (ADAPTER &a)
{
struct hack : ADAPTER {
static typename ADAPTER::container_type & get (ADAPTER &a) {
return a.*&hack::c;
}
};
return hack::get(a);
}

int main()
{
std::queue<int> foo;
foo.push(10);
foo.push(20);
foo.push(30);
std::cout << "size of before foo: " << foo.size() << '\n';

get_container(foo).clear();

std::cout << "size of after foo: " << foo.size() << '\n';
return 0;
}

关于c++ - 使用作用域 queue::swap 清空 std::queue 是否违反任何规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56176738/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com