访问vector <vector <int>&gt;分子

时间:2017-04-11 08:56:29

标签: c++ vector indexing

我定义了:

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],这个嵌套的向量向量是不同的? (我希望能够通过使用两对方括号来访问内容。)

1 个答案:

答案 0 :(得分:5)

您的代码未进行编译,因为e->LinesIndicesvector<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()