检查对是否为空或未初始化

Check if pair is empty or uninitialized

本文关键字:初始化 是否 检查      更新时间:2023-10-16
 int main() {
   pair<int, int> res;
   // check here pair is empty ?
   // res = make_pair(1 , 2);

   return 0;
}

在上面的代码片段中,检查一对是否已启动的理想方法是什么?

编辑:正如下面的一些答案所指出的,在这里使用"未初始化"一词是错误的,更具体地说,我如何检查值是否已显式设置(除了默认构造函数(

没有单位化std::pair这样的东西。

std::pair 的默认构造函数将对其两个成员进行值初始化,对于整数对意味着两个int都将具有值 0。

在上面的代码片段中,检查一对是否已启动的理想方法是什么?

您检查自己喜欢的语言参考并意识到

  • std::pair需要默认可构造的类型和

  • std::pair默认构造函数默认初始化其数据成员。

因此,

std::pair<int, int> res;

将导致res.firstres.second均为零。


当您需要向对象添加额外的空状态时,始终可以选择将其显式包装到std::optional中(如果无法使用 C++17,则boost::optional(。这样,您可以随时检查是否有有意义的std::pair

#include <optional>
std::optional<std::pair<int, int>> res;
if (res) // the pair is initialized and usable
   doStuff(*res);
else // ... it's not, hence initialize it
   res = std::make_pair(42, 43);

您可以编写类似于以下内容的函数

namespace usr
{
    template <class T1, class T2>
    bool empty( const std::pair<T1, T2> &p )
    {
        return p == std::pair<T1, T2>();
    }
}

即默认初始化的对将被视为 ampty。

这是一个演示程序

#include <iostream>
#include <utility>
namespace usr
{
    template <class T1, class T2>
    bool empty( const std::pair<T1, T2> &p )
    {
        return p == std::pair<T1, T2>();
    }
}
int main()
{
    std::pair<int, int> p1( 1, 2 );
    std::cout << usr::empty( p1 ) << 'n';
    std::pair<int, int> p2;
    std::cout << usr::empty( p2 ) << 'n';
}

它的输出是

0
1
这取决于

您如何定义std::pair为空std::pair的默认构造函数将值初始化对的两个元素,这意味着对于pair<int, int> res;,其firstsecond将被初始化为0。这是检查默认构造std::pair的唯一方法,如果它们在赋值后保证为非零。