0

想象

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

我们想将每个对象设置为 nullptr。但以下代码会产生 2 个错误。变量 row 和 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。

4

3 回答 3

2

你似乎混淆了很多事情。

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

  1. 不将它们插入您的结构中
  2. 使用指针并将它们设置为空(如果你这样做,请使用智能指针)
  3. 使用 boost::optional

其次:您混淆了指针和索引

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
于 2012-12-24T20:24:35.357 回答
1

您正在混淆迭代器和索引。使用运算符取消引用迭代器*

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

这是假设它Objekt是一个指针的 typedef 或者它有一个可以接受的赋值运算符nullptr。否则你需要使用Objekt*

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

std::vector<std::vector<Objekt> > m_poles(numrows, std::vector<Objekt>(numcols, nullptr));
于 2012-12-24T20:29:04.153 回答
0

你应该使用指针:

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;
    }
}
于 2012-12-24T20:23:57.020 回答