2017-04-11 32 views
0

我已经定义:访问向量<vector<int>>元素

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

+2

你有一个指向矢量向量的int指针。您正在索引指针,而不是顶级矢量。 – hlt

+0

@hlt我无法根据你的提示找出我的问题。显然我缺乏基础知识。你能否展示什么是访问内部向量内容的正确语法? – Sturm

+0

写一个正确的答案,给我一分钟;) – hlt

回答

5

由于您的e->LinesIndicesvector<vector<int>>*(即指针),您的代码不会编译。

在C++中,与在C中一样,可以在指针上使用数组表示法 - a[index] is equivalent to *(a + index)。如果您的指针指向数组的第一个元素,那么您将如何使用该数组。不幸的是,你只有通过new分配的单个向量。如果j不是0(因为您访问的矢量没有实际的矢量),通过e->LinesIndices[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 
} 

然而,在您的矢量数据已经在堆上。通过new分配一个std::vector是我个人经验中很少需要的东西,如果您没有必要在这里指定一个指针(这将很大程度上取决于您使用的上下文),我会直接建议创建矢量(没有指针)。如果您选择此方法,则需要使用e->LinesIndices.size()而不是e->LinesIndices->size()

+0

'*'应该在家长的内部。 – Jarod42