我有两套非常相似的代码。我想强调它们不是顺序的,甚至不是在同一个程序中。我只是将它们并排放在一起用于说明目的:
std::list<int*> bob;
int * j = new int;
*j = 5;
bob.push_front(j);
std::list<int>::const_iterator goop = bob.begin();
bob.push_front(*goop); //takes issue with inserting goop
std::list<int> bob;
j = 5;
bob.push_front(j);
std::list<int>::const_iterator goop = bob.begin();
bob.push_front(*goop); //inserts goop just fine
第一个是整数指针列表,第二个是整数。 第一个问题是我在尝试插入时解除引用迭代器,抱怨typage,特别想要&#34; int * const&amp; &#34;
这里发生了什么?我如何误解迭代器如何引用它们的底层数据以及如何执行第二种情况以便我可以从列表的迭代器插入列表?
答案 0 :(得分:3)
改变这个:
std::list<int>::const_iterator goop = bob.begin();
到此:
std::list<int*>::const_iterator goop = bob.begin();
因为您希望第一个示例中的指向整数的指针。
答案 1 :(得分:1)
您使用的迭代器是list<int>::const_iterator
,但您正在使用它迭代list<int*>
。
您需要使用list<int*>::const_iterator
来迭代list<int*>
。
答案 2 :(得分:0)
我不明白你的困惑。 list
部分完全无关紧要。你在这里要做的是:
int* j = new int;
int i = j; // illegal, pointer vs integer
j = i; // illegal, integer vs pointer
就这么简单。
std::list<int*> bob;
bob是指针到int
eger值(int*
)的列表。它的值类型非常简单int*
。
int * j = new int;
j
是指向整数
*j = 5;
这条线与这个问题完全无关。
bob.push_front(j);
这会将最近分配的地址推送到列表的前面。不是值5,即内存的地址。
std::list<int>::const_iterator goop = bob.begin();
goop
是列表的迭代器,其值类型为int
,而不是int*
,因此此行不会编译(http://ideone.com/zfmvPR),因为list<int>
和list<int*>
是完全不同的类型。
bob.push_front(*goop); //takes issue with inserting goop
如果前一行已编译,则这将是非法的,因为*goop
的类型为int
,但bob
的值类型为{{1} } int*
。
int
需要bob.push_front
。 int*
将是*goop
。
也许您应该考虑利用C ++ 11中的int
关键字
auto
但是如果您要使用C ++ 11并且您的列表负责这些指针的所有权,您应该考虑使用std::list<int*> bob;
bob.push_front(new int);
auto it = bob.begin(); // std::list<int*>::iterator it = bob.begin();
// or auto it = bob.cbegin(); if you want a const_iterator
pop.push_front(*it);
代替,因为您显示的代码未显示使用std::unique_ptr
。
delete
当你犯这个错误时,现在很多更清楚了:
std::list<unique_ptr<int>> bob;