STL list :: iterator问题 [英] STL list::iterator problem

查看:62
本文介绍了STL list :: iterator问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,


List及其迭代器按以下方式工作:


list< intmylist;

list< int> :: iterator itr;

itr = mylist.begin();

cout<< (* itr);


但是我想要这样的东西:


list< intmylist;

MyIterator itr (mylist);

cout<< (* itr);

所以我按照以下方式写了MyIterator:


template< class Tclass MyIterator:public list< T> :: iterator

{

public:

MyIterator(){};


~MyIterator(){};


MyIterator(列表< T>& mylist){


/ *我应该写在这里* /

};

};


int main()

{

list< intmylist;

mylist.push_back(1);

mylist.push_back(2);


/ *我想支持以下构造* /


MyIterator iter(mylist);

cout<< * mylist;


返回0 ;

}


有人可以指导我在一个参数中编写的内容

构造函数吗?或者你们有不同的解决方案吗?


我从list< T> :: iterator派生MyIterator的原因是我想要

来支持所有的重载运算符列表< T> :: iterator支持。


谢谢

Jayesh Shah

解决方案

您好

ja ***** @ gmail.com 写道:


列表及其迭代器的工作方式如下:


list< intmylist;

list< int> :: iterator itr;

itr = mylist.begin();

cout<< (* itr);


但是我想要这样的东西:


list< intmylist;

MyIterator itr (mylist);

cout<< (* ITR);



有什么区别? MyIterator需要是一些模板,因为

否则你无法区分不同的元素类型。所以它可能是
可能是MyIterator< int>。我看不出有什么区别

list< int> :: iterator。


Markus


ja*****@gmail.com 写道:


大家好,


列表及其迭代器的工作方式如下:


list< intmylist;

list< int> :: iterator itr;

itr = mylist.begin();

cout<< (* itr);


但是我想要这样的东西:


list< intmylist;

MyIterator itr (mylist);

cout<< (* ITR);



为什么?对我来说看起来像BadIdea(tm)。


所以我按照以下方式写了MyIterator:


template< class Tclass MyIterator:公共列表< T> :: iterator



注意:不保证列表< T> :: iterator是可继承的。但是,

这在实践中不会成为问题,因为据我所知,所有广泛使用的实现都将list<> :: iterator实现为一个没有的类

敲定技巧。


{

public:

MyIterator(){};


~MyIterator(){};


MyIterator(list< T>& mylist){


/ *我应该写在这里* /

};



你需要构建基数:


MyIterator(list< T& mylist)

:list< T> :: iterator(mylist.begin())

{}


(未经测试)


};


int main()

{

list< intmylist;

mylist.push_back(1);

mylist.push_back(2);


/ *我想支持以下构造* /


MyIterator iter(mylist);

cout<< * mylist;


返回0;

}



你打算如何在循环中使用这些迭代器:


MyIterator itr( mylist);

while(itr!= ???){

...

++ itr;

}


有人可以指导我在一个参数中编写的内容

构造函数吗?或者你们有不同的解决方案吗?



是:使用mylist.begin()和mylist.end()。


[snip]

Best


Kai-Uwe Bux


11月24日下午1:34,jaye ... @ gmail.com写道:


大家好,


列表及其迭代器的工作方式如下:


list< intmylist;

list< int> :: iterator itr;

itr = mylist.begin();

cout<< (* itr);


但是我想要这样的东西:


list< intmylist;

MyIterator itr (mylist);

cout<< (* ITR);



我会承认我没有测试过这个,但我很确定

STL-iterators有副本 - 构造函数所以这样的事情应该是b $ b工作:


#include< list>

#include< iostream>


typedef MyList std :: list< int>

typedef MyIterator std :: list< int> :: iterator


MyList l;

MyIterator itr(l.begin());

std :: cout<< * itr;


> template< class Tclass MyIterator:public list< T> :: iterator
{

public :

MyIterator(){};


~MyIterator(){};


MyIterator(list< T>& mylist){


/ *我应该写在这里* /

};

};



如果你真的想按照自己的方式去做,我认为你需要像这样初始化派生类的

基数(再次,未经测试):


#include< list>

#include< iostream>


template< class Tclass MyIterator:public list< T> :: iterator

{

MyIterator(std :: list< T>& l)

:std :: list< T> :: iterator(l.begin())

{};

};


int main()

{

std :: list< intl;

l.push_back(2);

MyIterator< intiter(l);

std :: cout<< * iter;

返回0;

}


注意模板参数,就像Markus指出的那样,创建

一个MyIterator级的实例。


-

Erik Wikstr?m


Hi All,

List and its iterator work as following way :

list<intmylist;
list<int>::iterator itr;
itr = mylist.begin();
cout << (*itr);

But I want something like this:

list<intmylist;
MyIterator itr(mylist);
cout<< (*itr);
So I wrote MyIterator following way :

template <class Tclass MyIterator : public list<T>::iterator
{
public:
MyIterator() { };

~MyIterator() { };

MyIterator(list<T>& mylist) {

/* What I should write here */
};
};

int main()
{
list<intmylist;
mylist.push_back(1);
mylist.push_back(2);

/* I want to support following construct */

MyIterator iter(mylist);
cout <<*mylist;

return 0;
}

Can anybody please guide me what I should write in one parameter
constructor ? Or do you have all together different solution ?

The reason I derived MyIterator from list<T>::iterator is that I want
to support all the overloaded operator that list<T>::iterator supports.

Thanks
Jayesh Shah

解决方案

Hi

ja*****@gmail.com wrote:

List and its iterator work as following way :

list<intmylist;
list<int>::iterator itr;
itr = mylist.begin();
cout << (*itr);

But I want something like this:

list<intmylist;
MyIterator itr(mylist);
cout<< (*itr);

What is the difference? MyIterator will need to be some template, as
otherwise you cannot distinguish different element types. So it would
probably be MyIterator<int>. I can''t see any difference to
list<int>::iterator.

Markus


ja*****@gmail.com wrote:

Hi All,

List and its iterator work as following way :

list<intmylist;
list<int>::iterator itr;
itr = mylist.begin();
cout << (*itr);

But I want something like this:

list<intmylist;
MyIterator itr(mylist);
cout<< (*itr);

Why? Looks like a BadIdea(tm) to me.

So I wrote MyIterator following way :

template <class Tclass MyIterator : public list<T>::iterator

Note: there is no guarantee that list<T>::iterator is inheritable. However,
this will not be a problem in practice since, as far as I know, all widely
used implementations implement list<>::iterator as a class without
finalizing trickery.

{
public:
MyIterator() { };

~MyIterator() { };

MyIterator(list<T>& mylist) {

/* What I should write here */
};

You need to construct the base:

MyIterator ( list<T& mylist )
: list<T>::iterator( mylist.begin() )
{}

(untested)

};

int main()
{
list<intmylist;
mylist.push_back(1);
mylist.push_back(2);

/* I want to support following construct */

MyIterator iter(mylist);
cout <<*mylist;

return 0;
}

And how do you intend to use these iterators in a loop:

MyIterator itr ( mylist );
while ( itr != ??? ) {
...
++itr;
}

Can anybody please guide me what I should write in one parameter
constructor ? Or do you have all together different solution ?

Yes: use mylist.begin() and mylist.end().

[snip]
Best

Kai-Uwe Bux


On Nov 24, 1:34 pm, jaye...@gmail.com wrote:

Hi All,

List and its iterator work as following way :

list<intmylist;
list<int>::iterator itr;
itr = mylist.begin();
cout << (*itr);

But I want something like this:

list<intmylist;
MyIterator itr(mylist);
cout<< (*itr);

I''ll admit that I have not tested this but I''m quite sure that
STL-iterators have a copy-constructor so something like this ought to
work:

#include <list>
#include <iostream>

typedef MyList std::list<int>
typedef MyIterator std::list<int>::iterator

MyList l;
MyIterator itr(l.begin());
std::cout << *itr;

>template <class Tclass MyIterator : public list<T>::iterator
{
public:
MyIterator() { };

~MyIterator() { };

MyIterator(list<T>& mylist) {

/* What I should write here */
};

};

If you realy want to do it your way I think you need to initialize the
base of your derived class like this (again, untested):

#include <list>
#include <iostream>

template <class Tclass MyIterator : public list<T>::iterator
{
MyIterator (std::list<T>& l)
: std::list<T>::iterator(l.begin())
{ };
};

int main()
{
std::list<intl;
l.push_back(2);
MyIterator<intiter(l);
std::cout << *iter;
return 0;
}

Notice the template parameter, like Markus pointed out, when creating
an instance of the MyIterator-class.

--
Erik Wikstr?m


这篇关于STL list :: iterator问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆