首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问vector<vector<int>>元素

访问vector<vector<int>>元素
EN

Stack Overflow用户
提问于 2017-04-11 08:56:29
回答 1查看 1.4K关注 0票数 0

我的定义是:

代码语言:javascript
复制
const  vector<vector<int>> *ElementLines::Quad4 = new vector<vector<int>>
{
    { 0, 1 },
    { 1, 2 },
    { 2, 3 },
    { 3, 0 }
};

稍后,我想对对象指向的集合进行迭代:

代码语言:javascript
复制
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)
        }

上面的代码不会编译:

代码语言:javascript
复制
no suitable conversion function from "const std::vector<int, std::allocator<int>>" to "int" exists  

但是如果我添加LinesIndices[j][0][0],它确实提供了一个int。我不太明白这里发生了什么。为了访问向量,我只使用了一对方括号[i],这对嵌套向量有什么不同吗?(我希望能够使用两对方括号访问内容)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-11 09:13:18

您的代码没有编译,因为您的e->LinesIndices是一个vector<vector<int>>* (即指针)。

在C++中,就像在C中一样,您可以对指针-*(a + index)使用数组表示法。如果指针指向数组的第一个元素,这正是使用该数组的方式。不幸的是,您只有一个通过new分配的向量。如果e->LinesIndices[j]不是0(因为在没有实际向量的情况下访问向量),通过j访问该指针是件非常糟糕的事情。

有两种方法可以解决这个问题。如果您真的希望将向量保存在通过new分配的堆中(我希望您在某个时候将其分配给delete!),您可以在访问它之前取消对指针的引用:

代码语言:javascript
复制
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()

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43341153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档