检查向量是否在某个位置未初始化
Check if vector is uninitialised at a certain position
这似乎是一件非常基本的事情,但无论如何到目前为止我都无法找到解决方案,因为我总是只找到询问如何检查向量是否真的为空的问题,这不是我想要检查的。
请考虑以下代码示例:
#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, 2
和3
。
最小示例:
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;
}
查看演示
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 递增 'int i = 0' 以在初始化的字符数组的位置递增
- 为什么未初始化的内存位置的值给出 -842150451 的值?
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 通过在此指针上放置新位置重新初始化对象时未定义的行为
- 检查向量是否在某个位置未初始化
- 在初始化的内存上使用放置新位置是否合法
- 松散耦合模块初始化的位置
- 是否可以在没有push_back(C++STL)的情况下使用数组初始化矢量的新位置
- 为什么与普通cout的行为相比,C 中的for循环访问非初始化的内存位置
- 无法写入使用 malloc 初始化的位置
- 初始化随机生成器的最佳位置
- 静态变量的初始化:位置相关
- 初始化静态成员变量值的正确位置
- 初始化 SSE 常量的位置
- 初始化多维数组中的所有位置
- 在皮条类中初始化默认值的最佳位置
- 位置new用于初始化原地对象
- c++初始化器不断地在同一内存位置创建新对象