| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 756 人关注过本帖
标题:哪里错了啊?容器类问题!
只看楼主 加入收藏
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
 问题点数:0 回复次数:8 
哪里错了啊?容器类问题!
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'




搜索更多相关主题的帖子: 容器 
2007-04-17 10:36
游乐园
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:671
专家分:0
注 册:2006-11-1
收藏
得分:0 

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

就像
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);


unicorn-h.spaces. ◇◆ sava-scratch.spaces.
2007-04-17 11:39
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
以下是引用游乐园在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());
这样就可以,也可以用指针迭代数组去初始化向量的!


Fight  to win  or  die...
2007-04-17 11:51
游乐园
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:671
专家分:0
注 册:2006-11-1
收藏
得分:0 

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

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


unicorn-h.spaces. ◇◆ sava-scratch.spaces.
2007-04-17 12:01
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 

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

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

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


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


Fight  to win  or  die...
2007-04-17 12:45
游乐园
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:671
专家分:0
注 册:2006-11-1
收藏
得分:0 

举个例子
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 是内存中实际的地址

无论是什么容器 在初始化的时候都可以用"具体的地址"来初始化的 你所混淆的就是" 迭代器不是地址 " 它只是相当于上面类的一个指针,只为自己的类服务

unicorn-h.spaces. ◇◆ sava-scratch.spaces.
2007-04-17 14:03
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
以下是引用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的时候就不行。



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


Fight  to win  or  die...
2007-04-17 16:42
游乐园
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:671
专家分:0
注 册:2006-11-1
收藏
得分:0 

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

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

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

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

___________________________

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


unicorn-h.spaces. ◇◆ sava-scratch.spaces.
2007-04-17 18:29
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 

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


Fight  to win  or  die...
2007-04-17 19:28
快速回复:哪里错了啊?容器类问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031054 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved