将数据从迭代器插入列表的问题

时间:2016-09-02 19:44:14

标签: c++ list pointers compiler-errors iterator

我有两套非常相似的代码。我想强调它们不是顺序的,甚至不是在同一个程序中。我只是将它们并排放在一起用于说明目的:

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;

这里发生了什么?我如何误解迭代器如何引用它们的底层数据以及如何执行第二种情况以便我可以从列表的迭代器插入列表?

3 个答案:

答案 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_frontint*将是*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;