野战二维向量C++困难 我在C++类中定义了2D向量私有属性: std::vector< std::vector<unsigned int> > m_voisins; template<typename N> void Graphe<N>::initialiseVoisins(size_t n) { m_voisins.resize(n); vector <unsigned int> voisins; for(unsigned int i=0; i<n; ++i) { for(unsigned int u=0; u<n; ++u) { if(m_matriceAdj[i][u]!=numeric_limits<N>::max() && u!=i) { voisins.push_back(u); } } m_voisins.push_back(voisins); voisins.clear(); } }

野战二维向量C++困难 我在C++类中定义了2D向量私有属性: std::vector< std::vector<unsigned int> > m_voisins; template<typename N> void Graphe<N>::initialiseVoisins(size_t n) { m_voisins.resize(n); vector <unsigned int> voisins; for(unsigned int i=0; i<n; ++i) { for(unsigned int u=0; u<n; ++u) { if(m_matriceAdj[i][u]!=numeric_limits<N>::max() && u!=i) { voisins.push_back(u); } } m_voisins.push_back(voisins); voisins.clear(); } },c++,C++,我得到的结果是0 我很想知道这是为什么? 这个实现对我来说似乎很好,希望我错了呵呵。谢谢。因为你有m_voisins.resizen;在开始时,它只是在m_voisins的开始处创建n个空向量 移除m_voisins.resizen;,或者使用m_voisins[i]=voisins;而不是推回 哎呀!现在你将得到n*2个元素,其中的前一半,你要检查的元素,里面什么都没有 我相信你的意思是: m_voisins.reserve(n); 这会预先分配内存,以便在不实际添加任何逻辑元素的情况下,尽

我得到的结果是0

我很想知道这是为什么? 这个实现对我来说似乎很好,希望我错了呵呵。谢谢。

因为你有m_voisins.resizen;在开始时,它只是在m_voisins的开始处创建n个空向量

移除m_voisins.resizen;,或者使用m_voisins[i]=voisins;而不是推回

哎呀!现在你将得到n*2个元素,其中的前一半,你要检查的元素,里面什么都没有

我相信你的意思是:

m_voisins.reserve(n);

这会预先分配内存,以便在不实际添加任何逻辑元素的情况下,尽可能快地执行推回操作。

您能创建一个并向我们展示吗?何时何地检查矩阵?如何保证if语句和函数调用?您是否尝试过在调试器中单步执行该函数?@πάνταῥεῖ 嗯,没有[我]应该是正确的。@timrau嗯,你说得对。那么辞职就是问题所在。我的更正应该像m_voisins[i]=voisins@约阿希姆·皮勒堡。我在没有删除if语句的情况下尝试了它,但它仍然给了我同样的结果。在我的代码中,很多地方都使用了相同的if语句,而且效果很好。我会试试调试器。我可以保证中间的if语句不是问题,然后通过从你的例子中提取它来证明它,这样它就不会分散我们的注意力,而且B会引起怀疑。或者,编写保留而不是调整大小,保持推送回来。这就是我要做的。
m_voisins.resize(n);
m_voisins.reserve(n);