检查向量是否在某个位置未初始化

Check if vector is uninitialised at a certain position

本文关键字:位置 初始化 向量 是否 检查      更新时间:2023-10-16

这似乎是一件非常基本的事情,但无论如何到目前为止我都无法找到解决方案,因为我总是只找到询问如何检查向量是否真的为空的问题,这不是我想要检查的。
请考虑以下代码示例:

#include <iostream>
#include <vector>
using namespace std;
struct Atom {
int x,y;
int pol;
};
int main() {
vector<vector<Atom>> vec=vector<vector<Atom>>(5,vector<Atom>(5));
cout<<(vec[0][0]==nullptr); // this line doesn't compile, because the vector doesn't hold pointers.
return 0;
}

我正在尝试声明自定义类型的对象向量的向量。在程序开始时,我将初始化向量,使其具有特定的大小,但不为其分配实际对象。现在我希望能够检查我是否已经将对象分配给矢量的特定位置。我想使用类似vec==nullptr的东西,但这不起作用,因为向量中的对象不是指针。不幸的是,我不能只是更改结构标准构造函数来放置一些我可以像Atom.pol==-2一样检查的指标值,因为该类是由 ROS 消息创建的。关于如何检查我是否已分配对象的任何其他建议?

编辑:在我分配对象后,pol 将始终为 -1 或 1。那么检查Atom.pol==0安全吗?当我尝试在 ideone.com 上执行此操作时,它总是有效,但我认为它不能保证为 0,对吧?!

无法检查对象是否已初始化。也就是说,std::vector的元素总是初始化的,所以也不需要检查。

您似乎想要表示"未分配"的对象。标准库为您提供了一个模板:std::optional。如果创建矢量可选对象,则这些对象在值初始化时将处于"未分配"状态。

编辑:在我分配对象后,pol 将始终为 -1 或 1。那么检查 Atom.pol==0 安全吗?

是的,这将是安全的,因为您使用的构造函数使用值初始化参数初始化 elment。

如果可以假设对象的某些状态"无效",则不一定需要使用std::optional。如果值初始化状态是这样的无效状态,则也不需要向类添加默认构造函数。就像值初始化指针比较等于nullptr一样,初始化值的整数成员也是如此,Atom比较等于0。

但我假设它不能保证是 0,对吧?!

保证为 0。

使用pol == 0的解决方案应该没问题,前提是pol == 0实际上不是该对象所处的正常状态,并且您不要使用未初始化的实例尝试它。

您正在使用的构造函数std::vector保证默认插入新元素。如果您使用的是默认分配器(您是),则执行这些新元素的值初始化。由于Atom是具有既非用户提供也不删除的默认构造函数的类类型,因此Atom实例初始化为零。这意味着Atom成员的每个值都初始化为零。

请注意,这是std::vector做的事情。您需要将Atom初始化为零才能使此方法正常工作。如果您尝试以下操作,它将是未定义的行为。Atom成员没有初始化,更不用说保证为零了:

int main()
{
Atom a;
std::cout << (a.pol == 0); // <- Not okay
}

您可以通过添加{}来强制初始化值:

int main()
{
Atom a{};
std::cout << (a.pol == 0); // <- Okay now
}

编辑:不小心对两个示例使用了相同的代码示例。

一种方法是将vec的签名更改为,

vector<vector<Atom*>> vec=vector<vector<Atom*>>(5,vector<Atom*>(5));

然后,您可以执行空 ptr 检查以查看给定元素是否已初始化。不过,这确实增加了一些复杂性,因为您必须自己处理内存分配。

如果要将Atom的成员初始化为特定值并检查它们是否已初始化,则可以执行此操作。

vector<vector<Atom>> vec=vector<vector<Atom>>(5,vector<Atom>(5, {1, 2, 3}));

这会将x, y, pol分别初始化为1, 23

最小示例:

int main() {
using std::cout;
using std::vector;
vector<vector<Atom>> vec=vector<vector<Atom>>(5,vector<Atom>(5, {1, 2, 3}));
cout<<((vec[0][0]).x == 1) << "n"; 
cout<<((vec[0][0]).y == 2)  << "n";
cout<<((vec[0][0]).pol == 3)  << "n";
cout<<((vec[0][0]).x == -1) << "n"; 
cout<<((vec[0][0]).y == -1)  << "n";
cout<<((vec[0][0]).pol == -1)  << "n";
return 0;
}

查看演示