在 2D 矢量上使用迭代器打印值

Printing values using Iterator on 2d vector

本文关键字:迭代器 打印 2D      更新时间:2023-10-16

这是我的代码:

std::vector< std::vector<std::shared_ptr<int>> > om(2, std::vector<std::shared_ptr<int>>(2));
om[0][0] = std::shared_ptr<int>(std::make_shared<int>(1));
om[0][1] = std::shared_ptr<int>(std::make_shared<int>(2));
om[1][0] = std::shared_ptr<int>(std::make_shared<int>(3));       //init values
om[1][1] = std::shared_ptr<int>(std::make_shared<int>(4));
std::vector<std::shared_ptr<int>>::iterator pd;                  //inner iterator
std::vector< std::vector<std::shared_ptr<int>> >::iterator px;   //outer iterator

for(px = om.begin(); px != om.end(); px++){                    
    for(pd = (*px).begin(); pd !=  (*px).end(); pd++){
    std::cout<< *pd[0] << std::endl;
    }
}

输出:

1 2 3 4

我正在使用shared_ptr制作 2d 矢量,我的目标是打印值

我的问题:

从我看到的其他示例中,您只需要取消引用迭代器即可获取值,但就我而言,如果我使用 std::cout<< *pd << std::endl;它将打印原始地址,这不是我想要的。

但是,如果我使用std::cout<< *pd[0] << std::endl;那么它将打印正确的值。

我这样想象它:

[ [1][2], [3][4] ]

其中 px 将迭代 2 个块,而 pd 总共必须迭代 4 个块。

为什么我必须放[0]才能打印? 还是未定义?

由于pd属于std::vector<std::shared_ptr<int>>::iterator类型,*pd属于std::shared_ptr<int>类型。必须再次取消引用才能获取整数值。

*pd[0]等价于*(*(pd+0)),而又等价于**pd

为什么我必须输入 [0] 才能打印? 还是未定义?

std::vector::iterator是一个随机访问迭代器。这为operator[]提供了与原始指针相同的语义。因此,p[0]具有取消引用迭代器的效果,为您提供shared_ptr的左值引用。然后你用*取消引用它,给你它"指向"int

您也可以这样做,这可能更容易遵循:

std::cout<< **pd << std::endl;