簡體   English   中英

如何將2D向量中的對象設置為空指針[C ++]

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

想像

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

我們想將每個對象設置為nullptr。 但是以下代碼會產生2個錯誤。 未聲明Vars 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。

您似乎混淆了很多事情。

第一:您有一個對象向量的向量。 那很好! 但是,它是對象,而不是指針(再次證明是好的),因此它不能為null,因為只有指針可以為null(最后一次,這很好,沒有無效的內存訪問,空指針異常…)。 如果要處理可選元素,則必須決定不同的策略:

  1. 不將它們插入結構中
  2. 使用指針並將其設置為null(如果這樣做,請使用智能指針)
  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

您正在混合迭代器和索引。 使用*運算符可取消對迭代器的引用。

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));

您應該使用指針:

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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM