检查对是否为空或未初始化
Check if pair is empty or uninitialized
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.first
和res.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;
,其first
和second
将被初始化为0
。这是检查默认构造std::pair
的唯一方法,如果它们在赋值后保证为非零。
相关文章:
- 列表初始化是否将原子初始化为零
- 使用函数声明进行函数指针初始化 - 是否可能
- 值初始化是否适用于原子对象?
- 聚合的值初始化是否使用其成员的默认初始值设定项?
- C 11联合会的空列表初始化 - 是否保证可以初始化工会的全长
- 找出静态初始化是否结束
- 非本地非内联变量的初始化:是否严格在"main()"函数调用之前进行
- 空字符数组的初始化是否有效
- 变量零初始化-是否有未定义的行为
- 0-原子的初始化是否保证将值成员设置为0
- POD 类对象初始化是否需要构造函数
- 在C++中使用类似 c 的初始化或构造函数初始化是否被认为更好
- 类内成员初始化是否删除赋值运算符
- C++11;非静态数据成员初始化是否可以访问其他数据成员
- 列表初始化是否为隐式转换
- 复制列表初始化是否在概念上调用复制 ctor
- 如何测试/验证零初始化是否发生
- C++默认初始化是否保留先前的零初始化
- 使用新结构体进行聚合初始化是否有效
- 检测CRT初始化是否在注入过程中完成