在二维向量上使用迭代器打印值
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]
才能打印?还是未定义?
由于 pd
是 std::vector<std::shared_ptr<int>>::iterator
类型,*pd
是 std::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;
这是我的代码:
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]
才能打印?还是未定义?
由于 pd
是 std::vector<std::shared_ptr<int>>::iterator
类型,*pd
是 std::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;