如何将2D向量中的对象设置为空指针[C ]

How to set objects in 2D vector to null pointer [C++]

本文关键字:设置 空指针 对象 2D 向量      更新时间:2023-10-16

想象

std::vector<std::vector<Objekt>> m_pole;

我们要将每个对象设置为nullptr。但是以下代码会产生2个错误。vars行和col未声明。

    std::vector<std::vector<Objekt>>::std::iterator row;
    std::vector<Objekt>::std::iterator col;
    for(row = m_pole.begin(); row != m_pole.end(); row++) {
        for(col = row->begin(); col != row->end(); col++) {
            m_pole[row][col] = nullptr;
        }
    }

有什么想法如何解决这个问题?感谢您的答案,Mk。

您似乎混淆了多件事。

首先:您有一个对象向量的向量。那挺好的!但是,它是对象,而不是指针(再次很好),因此不能无效,因为只有指针才能为null(最后一次,这是好的,没有无效的内存访问,无效的指针异常……)。如果要处理可选元素,则必须在不同策略之间做出决定:

  1. 不要将它们插入您的结构
  2. 使用指针并将其设置为null(如果这样做,请使用智能指针)
  3. 使用boost ::可选

其次:您正在混淆指针和索引

std::vector<std::vector<Objekt>>::iterator row_it; // where does this std came from ?
std::vector<Objekt>::iterator element_it; // the iterator points to an element
for(row_it = m_pole.begin(); row_it != m_pole.end(); ++row_it) { // Get the habit to pre-increment
    for(element_it = row_it->begin(); element_it != row->end(); ++element_it) {
        *element_it = nullptr; // This won't work, as it's an object, not a pointer
    }
}

第三:C 11具有不错的迭代器(其他明智的使用boost_foreach):

for(auto & row : m_pole) // reference is importante !
    for(auto & element : row)
        element = nullptr; // again, can't work because it's an object

您正在混合迭代器和索引。使用*运算符对迭代器进行了迭代。

for(row = m_pole.begin(); row != m_pole.end(); row++) 
{
  for(col = row->begin(); col != row->end(); col++)
    *col = nullptr;
}

这是假设Objekt是指针的打字机,或者它具有可以服用nullptr的分配操作员。否则您需要使用Objekt*

但是,您可以节省编写初始化循环并使用std::vector构造函数的麻烦。

std::vector<std::vector<Objekt> > m_poles(numrows, std::vector<Objekt>(numcols, nullptr));

您应该使用指针:

std::vector<std::vector<Objekt*>> m_pole;
std::vector<std::vector<Objekt*>>::std::iterator row;
std::vector<Objekt*>::std::iterator col;
for(row = m_pole.begin(); row != m_pole.end(); row++) {
    for(col = row->begin(); col != row->end(); col++) {
        *col = nullptr;
    }
}