在2d向量上使用Iterator打印值

时间:2015-06-03 06:08:27

标签: c++ vector stl iterator

这是我的代码:

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]才能打印?或者那是不确定的?

2 个答案:

答案 0 :(得分:3)

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

*pd[0]相当于*(*(pd+0)),相当于**pd

答案 1 :(得分:2)

  

为什么我必须放[0]才能打印?或者那是不确定的?

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

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

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