注册 登录
编程论坛 C++教室

哪里错了啊?容器类问题!

aipb2007 发布于 2007-04-17 10:36, 770 次点击
deque<int> de(10,5);
deque<int>::iterator p = de.begin(),q = de.end();
list<int> li(p,q);



错误信息:
error C2664: '__thiscall std::list<int,class std::allocator<int> >::std::list<int,class std::allocator<int> >(unsigned int,const int &,const class std::allocator<int> &)' : cannot convert para
meter 1 from 'class std::deque<int,class std::allocator<int> >::iterator' to 'unsigned int'




8 回复
#2
游乐园2007-04-17 11:39

每一种容器都有自己的迭代器 不可以混乱使用

就像
int a=3;
int *p=&a
float *q=p; //错误 , 一个道理 不同类型的指针间不能直接转换

所有只能

deque<int> de(10,5);
deque<int>::iterator p = de.begin(),q = de.end();
deque<int> li(p,q);

#3
aipb20072007-04-17 11:51
以下是引用游乐园在2007-4-17 11:39:20的发言:

每一种容器都有自己的迭代器 不可以混乱使用

就像
int a=3;
int *p=&a
float *q=p; //错误 , 一个道理 不同类型的指针间不能直接转换

所有只能

deque<int> de(10,5);
deque<int>::iterator p = de.begin(),q = de.end();
deque<int> li(p,q);

不是啊,那是容器的一种初始化,比如vector<int> vec(10,5);
list<int> li(vec.begin(),vec.end());
这样就可以,也可以用指针迭代数组去初始化向量的!

#4
游乐园2007-04-17 12:01

我的意思是迭代器的类型哦

而list<int> li(vec.begin(),vec.end()); 相当于把向量的首末地址用来初始化, 当然可以了

#5
aipb20072007-04-17 12:45

还是不明白,那用deque的迭代器去初始化list不行吗?
为什么vector就可以?

list<int> li(container.begin(),container.end());

上面这句话成立,只有当container是vector的时候?是deque就错误?


我混淆了,这些概念不清晰,麻烦你指导下,不胜感激!

#6
游乐园2007-04-17 14:03

举个例子
class base
{
public:
int m;}b,*p;

class new
{
public:
int n;
}n,*q;

这里base是个类 创建该类的指针 可以通过p->m 访问类里的元素

new是另一个类,创建自己的指针q ,你能用q=&b; 这样的语句嘛? 当然不行 因为类型不同

但一旦生成了base 和new的对象后 m与n在内存中就有了实际的地址 你可以通过地址直接访问他们 也可以通过自己的指针访问他们 即p->m 和q->n

_______________________________________________________

这里扩展到容器中道理是一样的

list<int> li;
list<int>::iterator p;
vector<int> v;
vector<int>::iterator q;

这里的int 是指容器中存放数据的类型;iterator 是该容器类型的指针, 它可以访问容器中的元素

一个容器对应一个类型的指针 不能互相访问的 就像不同指针间不能转换一样

而写成li.begin()或li.end() 是指容器开始或末尾的地址 如0x100F 是内存中实际的地址

无论是什么容器 在初始化的时候都可以用"具体的地址"来初始化的 你所混淆的就是" 迭代器不是地址 " 它只是相当于上面类的一个指针,只为自己的类服务
#7
aipb20072007-04-17 16:42
以下是引用aipb2007在2007-4-17 12:45:58的发言:

还是不明白,那用deque的迭代器去初始化list不行吗?
为什么vector就可以?

list<int> li(container.begin(),container.end());

上面这句话成立,只有当container是vector的时候?是deque就错误?


我混淆了,这些概念不清晰,麻烦你指导下,不胜感激!

游大哥,你上面说的意思我懂了,但是还是不能解释我的困惑——就是上面引用的部分。

你说的迭代器只为自己的类服务,迭代器不是地址,但是有个问题啊,仍然可以list<int> li(p,q)这样去初始化的,p,q分别为vector的迭代器,就是deque的时候就不行。



我都问的你烦了吧,真是惭愧!呵呵!

#8
游乐园2007-04-17 18:29

嗯 我想是不同容器的迭代器本身造成的 比如一个vector的迭代器定义

template class<class T>
class vector
{
typedef T* iterator;//vector中的迭代器,也许deque的更复杂,但都相当于一个指针
};

vector 说白了是个动态数组 空间是连续的 用begin() 和end() 给list 初始化可以

但deque 实际在内存中并不是连续分配的 只是操作的时候把他按照连续的操作而已 所以在用deque的迭代器指向begin()和end() 对list初始化时就不能成功

___________________________

ps: 我对STL也接触没多久 也希望更多人 分析分析

#9
aipb20072007-04-17 19:28

呵呵,学了不少,谢谢你啦!

1