std::队列初始化与 NULL
std::queue initialization with NULL
是否可以像其他变量一样用NULL
值初始化C++ std::queue
?
喜欢这个:
HANDLE variable = NULL;
class Test
{
}
即
std::queue<Test*> testQueue = NULL;
或
testQueue.empty();
或类似的东西?
如果你写这个:
std::queue<Test*> testQueue; //it is default initialized
那么这就足够了;不需要让它成为指针并用 NULL 初始化它。
此外,您可以这样做:
if ( testQueue.empty())
{
//testQueue is empty
}
如果使用指向队列的指针,则当然可以将其初始化为空指针(但如果可能的话,您可能希望避免这种情况)。
如果您只是定义一个队列,则可以测试它是否为空(如您所建议的,使用 .empty()
)。
要直接回答您的问题,请不要使用空指针对其进行初始化。默认情况下,队列为空,这就是您测试的内容(如其他答案所示)。但是,我认为这里有一个比这更深入的潜在问题,那就是在指针方面考虑得太多。
由于您使用的是容器,因此我建议您不要使用std::queue<Object *>
。相反,我建议尽可能使用std::queue<Object>
(存储对象,而不是指针)。不要使用任何类型的 null 值来指示对象未处于有效状态,只需初始化构造函数中的值(以便所有对象都处于有效状态),然后std::queue
中的所有对象都有效。在C++中,这应该是您对如何使用对象的偏好:
- 如果需要处理对象集合,则直接在堆栈上创建对象或存储在容器(最好是 STL 容器)中的对象 引用
- (例如,如果要将对象传递到函数中并希望避免复制,但此处引用是指通过
1
创建的对象) - 智能指针(这应该是
new
出现在代码中的唯一时间)。应谨慎使用它们,并且仅当您确定通过1
创建对象不起作用时。 - 常规指针。这几乎不应该被使用。在我的大多数项目中,我不使用任何原始指针。在其余部分,我只将它们用作一种缓存机制,其中长计算确定我正在操作哪个对象,而空指针表示我尚未确定它。但是,我仍然没有创建对象的"主"句柄是指针;指针指向我通过
1
创建的对象。
在确定要在容器中存储的内容时,还应遵循上述操作(首先首选对象集合,然后是引用,然后是智能指针,最后是原始指针)。
指针在 Java 中可能很常见,其中大多数变量都是在堆上创建的(或者用C++的说法,从自由存储中创建),它们在 C 中可能有些常见,其中 STL、引用和智能指针不存在,但它们在现代C++中没有太多位置。
是带有构造函数的C++对象。无需将其初始化为默认值。它始终以空队列开头。 .empty()
只是检查它是否为空。 如果需要,.clear()
会删除其内容,但在新建的上,这不是必需的。
- boost::进程间消息队列引发错误
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Android NDK传感器向事件队列报告奇怪的间隔
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如何在 c++ 中'NULL'字符串
- c++使用foreach使数组为null
- 当使用通配符和null指针调用函数时,对输出的说明
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 在一个读写器队列中,我可以用volatile替换原子吗
- 为什么我的多线程作业队列崩溃
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 如何在映射中返回null
- 使用"Task"函数指针队列定义作业管理器
- 在c++队列中使用pop和visit实现线程安全
- 将添加到队列的第一个元素作为 null 进行排序
- std::队列初始化与 NULL