我定义了:
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]
,这个嵌套的向量向量是不同的? (我希望能够通过使用两对方括号来访问内容。)
答案 0 :(得分:5)
您的代码未进行编译,因为e->LinesIndices
是vector<vector<int>>*
(即指针)。
在C ++中,与在C中一样,您可以在指针上使用数组表示法 - a[index]
is equivalent to *(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()
。