【问题标题】:Check if pair is empty or uninitialized检查pair是否为空或未初始化
【发布时间】:2019-07-19 09:06:14
【问题描述】:
 int main() {

   pair<int, int> res;
   // check here pair is empty ?
   // res = make_pair(1 , 2);


   return 0;
}

在上面的 sn-p 中,检查一对是否已初始化的理想方法是什么?

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

【问题讨论】:

  • 看起来像XY 问题
  • 你看看你的程序。某处有初始化吗?然后它被初始化。没有初始化?未初始化。在您的情况下, std::pair 构造函数中有初始化。由于没有空对这样的东西,这里的检查是微不足道的。
  • @CinCout 我想知道,为了这不是一个 XY 问题,mvce 应该是关于一般的 pair&lt;T, U&gt; 而不是特定的 pair&lt;int, int&gt;,对吧?
  • OP 可能把它弄傻了。只能猜测!

标签: c++ std-pair


【解决方案1】:

没有统一化的std::pair

Default constructor for std::pairvalue-initialize 它的两个成员,这对于 ints 对意味着 int 的值都为 0。

【讨论】:

    【解决方案2】:

    在上面的 sn-p 中,检查一对是否已初始化的理想方法是什么?

    您检查了您最喜欢的语言参考并意识到这一点

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

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

    因此,

    std::pair<int, int> res;
    

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


    当您需要向对象添加额外的空状态时,始终可以选择将其显式包装到 std::optional(或 boost::optional,如果您不能使用 C++17)。这样,您可以随时检查您是否有一个有意义的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);
    

    【讨论】:

      【解决方案3】:

      这取决于您如何定义std::pairstd::pair 的默认构造函数将对这对的两个元素进行值初始化,这意味着对于pair&lt;int, int&gt; res;,其firstsecond 将被初始化为0。这是您检查默认构造的std::pair 的唯一方法,前提是它们在分配后保证为非零。

      【讨论】:

        【解决方案4】:

        你可以写一个类似下面的函数

        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
        

        【讨论】:

          猜你喜欢
          • 2013-01-21
          • 1970-01-01
          • 2014-08-19
          • 1970-01-01
          • 2011-10-12
          • 2015-05-23
          • 2019-01-25
          • 2020-10-12
          • 1970-01-01
          相关资源
          最近更新 更多