gpt4 book ai didi

c++ - vector 迭代器在运行时不能在 vector*>*> 上取消引用

转载 作者:行者123 更新时间:2023-11-28 01:11:31 33 4
gpt4 key购买 nike

我有这个析构函数,它在运行时产生错误“vector 迭代器不可取消引用”。

gridMatrix 是一个 std::vector * > * > * > * >

我添加了 typename 和 typedef,但我仍然有错误。

我认为 vect* 的 vect* 的 vect* 的想法将使用 boost::multi_array,但我仍然想知道这是错误的。

/// @brief destructor
~AtomsGrid(void) {
// free all the memory for all the pointers inside gridMatrix (all except the Atom<T>* )
//typedef typename ::value_type value_type;

typedef std::vector<AtomsCell< Atom<T>* >*> std_vectorOfAtomsCell;
typedef std::vector<std_vectorOfAtomsCell*> std_vectorOfVectorOfAtomsCell;

std_vectorOfAtomsCell* vectorOfAtomsCell;
std_vectorOfVectorOfAtomsCell* vectorOfVecOfAtomsCell;
typename std_vectorOfVectorOfAtomsCell::iterator itSecond;
typename std_vectorOfVectorOfAtomsCell::reverse_iterator reverseItSecond;
typename std::vector<std_vectorOfVectorOfAtomsCell*>::iterator itFirst;


//typename std::vector<AtomsCell< Atom<T>* >*>* vectorOfAtomsCell;
//typename std::vector<std::vector<AtomsCell< Atom<T>* >*>*>* vectorOfVecOfAtomsCell;
//typename std::vector<std::vector<AtomsCell< Atom<T>* >*>*>::iterator itSecond;
//typename std::vector<std::vector<AtomsCell< Atom<T>* >*>*>::reverse_iterator reverseItSecond;
//typename std::vector<std::vector<std::vector<AtomsCell< Atom<T>* >*>*>*>::iterator itFirst;


for (itFirst = gridMatrix.begin(); itFirst != gridMatrix.end(); ++itFirst) {
vectorOfVecOfAtomsCell = (*itFirst);
while (!vectorOfVecOfAtomsCell->empty()) {
reverseItSecond = vectorOfVecOfAtomsCell->rbegin();
itSecond = vectorOfVecOfAtomsCell->rbegin().base();

vectorOfAtomsCell = (*itSecond); // ERROR during run: "vector iterator not dereferencable"
// I think the ERROR is because I need some typedef typename or template ???!!!
// the error seems here event at itFirst

//fr_Myit_Utils::vectorElementDeleter(*vectorOfAtomsCell);
//vectorOfVecOfAtomsCell->pop_back();
}
}
fr_Myit_Utils::vectorElementDeleter(gridMatrix);
}

如果有人想要产生错误的完整代码,我很乐意提供,但我认为我们无法在论坛中附加文件。但它仍然不是很大,所以如果你想要它,我可以在这里复制过去。

谢谢

最佳答案

如果 v 是一个 std::vector 那么 v.rbegin().base() == v.end() 是真的。在您的代码中,itSecond 实际上等于 vectorOfVecOfAtomsCell.end(),它超出了 vector 端并且不可取消引用。查看MSDN page for reverse_iterator::base了解更多信息。

至于解决方案:在您发布的代码中,我根本不明白您为什么需要 itSecondvectorOfAtomsCell = *reverseItSecond 应该会产生您期望的结果,没有错误。如果您确实需要指向最后一个元素的迭代器,您应该执行 itSecond = vectorOfVecOfAtomsCell->end()-1itSecond = reverseItSecond.base()-1

关于c++ - vector 迭代器在运行时不能在 vector<vector<vector<A*>*>*> 上取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2787491/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com