我的定义是:
const vector<vector<int>> *ElementLines::Quad4 = new vector<vector<int>>
{
{ 0, 1 },
{ 1, 2 },
{ 2, 3 },
{ 3, 0 }
};稍后,我想对对象指向的集合进行迭代:
for (int j = 0; j < e->LinesIndices->size(); j++)
{
int n1Index = e->LinesIndices[j][0]; //I expect 0 (for j = 0)
int n2Index = e->LinesIndices[j][1]; //I expect 1 (for j= 0)
}上面的代码不会编译:
no suitable conversion function from "const std::vector<int, std::allocator<int>>" to "int" exists 但是如果我添加LinesIndices[j][0][0],它确实提供了一个int。我不太明白这里发生了什么。为了访问向量,我只使用了一对方括号[i],这对嵌套向量有什么不同吗?(我希望能够使用两对方括号访问内容)。
发布于 2017-04-11 09:13:18
您的代码没有编译,因为您的e->LinesIndices是一个vector<vector<int>>* (即指针)。
在C++中,就像在C中一样,您可以对指针-*(a + index)使用数组表示法。如果指针指向数组的第一个元素,这正是使用该数组的方式。不幸的是,您只有一个通过new分配的向量。如果e->LinesIndices[j]不是0(因为在没有实际向量的情况下访问向量),通过j访问该指针是件非常糟糕的事情。
有两种方法可以解决这个问题。如果您真的希望将向量保存在通过new分配的堆中(我希望您在某个时候将其分配给delete!),您可以在访问它之前取消对指针的引用:
for (int j = 0; j < e->LinesIndices->size(); j++)
{
int n1Index = (*e->LinesIndices)[j][0];
int n2Index = e->LinesIndices[0][j][1]; // This would work too, but I wouldn't recommend it
}但是,向量中的数据已经在堆中了。根据我个人的经验,通过std::vector分配new是很少必要的,如果这里不需要有指针(这在很大程度上取决于您使用它的上下文),我建议直接创建向量(没有指针)。如果选择此方法,则需要使用e->LinesIndices.size()而不是e->LinesIndices->size()。
https://stackoverflow.com/questions/43341153
复制相似问题