我在c ++类中有2d vector private属性,如下所示:
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();
}
}
我可以保证中间的if语句不是问题。我试过没有它,仍然是相同的结果。 问题是我每次打电话似乎都是:
m_voisins[some_valid_index].size()
我得到结果0。
我很想知道为什么会这样? 对我来说实施似乎很好,希望我错了。谢谢。
答案 0 :(得分:5)
m_voisins.resize(n);
糟糕!现在你最终会得到n*2
元素,而前半部分(你正在检查的元素)中没有任何元素。
我确定你的意思是:
m_voisins.reserve(n);
这预先分配内存,以便push_back
尽可能快,而不实际添加任何逻辑元素。
答案 1 :(得分:3)
因为您在开头有m_voisins.resize(n);
,只会在n
的开头创建m_voisins
个空向量。
删除m_voisins.resize(n);
,或使用m_voisins[i] = voisins;
代替push_back()
。