在二维向量上使用迭代器打印值

Printing values using Iterator on 2d vector

这是我的代码:

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 制作二维矢量,我的目标是打印值

我的问题:

从我见过的其他例子来看,你只需要取消引用迭代器就可以得到值,但在我的例子中,如果我使用 std::cout<< *pd << std::endl; 它会打印原始地址,这不是我想要的想要。

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

我这样想象它:

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

其中px会迭代2块,pd总共要迭代4块。

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

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

*pd[0] 等同于 *(*(pd+0)),后者又等同于 **pd.

Why do i have to put [0] in order to print? or is that undefined?

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

您也可以这样做,这样做可能更容易理解:

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