把vector元素复制到动态数组里.. 其中一段代码看不懂[求解]

qiuyu_ts 2011-08-29 05:10:15

vector<int> iv;
int item;
while (cin >> item)
iv.push_back(item);

cout << iv.size() << endl;
int *ivs = new int[iv.size()];

int *tp = ivs; //就是这段.. 为什么需要另创建一个指针..??

for (vector<int>::iterator iter = iv.begin(); iter != iv.end(); ++iter,++tp)
*tp = *iter;

/*
*这是没有创建的版本, 结果就不对了..
for (vector<int>::iterator iter = iv.begin(); iter != iv.end(); ++iter,++ivs)
*ivs = *iter;
*/

for (size_t i = 0; i != iv.size(); ++i)
cout << ivs[i] << endl;


delete [] ivs;
...全文
147 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
mashiwenzhaoliyuan 2011-08-29
  • 打赏
  • 举报
回复
顶14楼!
qiuyu_ts 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 akirya 的回复:]

引用 6 楼 qiuyu_ts 的回复:

下面的循环对tp++了 所以需要一个指针保存原始值。

这句话不明白..

---
我调试时看的是, 不创建tp, 那么ivs的指针一直指向在第一个元素. 且在for循环结束后, 第一元素里的值又变为未初始化那种情况差不多..
3 变为 -1xxxxxxx 这样..

没tp的话
假设 ivs 在new之后的值是100000 ;假……
[/Quote]

明白了~谢谢您的解释..
Qlaiaqu 2011-08-29
  • 打赏
  • 举报
回复
呃~~~
int *tp = ivs; //就是这段.. 为什么需要另创建一个指针..??
for (vector<int>::iterator iter = iv.begin(); iter != iv.end(); ++iter,++tp)
*tp = *iter;
//////////////////////////////
tp一开始指向第一个元素,++一次指向下一个,遍历完了则指向之后一个元素之后,这时候你觉得你访问tp的地方在哪里?如果让tp又指向第一个元素?
这里不是由ivs保存了吗?答案就在这里。
qiuyu_ts 2011-08-29
  • 打赏
  • 举报
回复
在vs2008上测试结果和dev c++一样.. 这样应该不是编译器的问题了吧
mxss343314281 2011-08-29
  • 打赏
  • 举报
回复
ivs的指针一直指向在第一个元素,所以赋给另一个指针去++
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qiuyu_ts 的回复:]

下面的循环对tp++了 所以需要一个指针保存原始值。

这句话不明白..

---
我调试时看的是, 不创建tp, 那么ivs的指针一直指向在第一个元素. 且在for循环结束后, 第一元素里的值又变为未初始化那种情况差不多..
3 变为 -1xxxxxxx 这样..
[/Quote]
没tp的话
假设 ivs 在new之后的值是100000 ;假设有10个元素。
那么在for 之后ivs的值就是 100040;
之后的输出就是
for (size_t i = 0; i != iv.size(); ++i)
cout << ivs[i] << endl; //访问的就是100040 100044 100048 ....
看到没,你输出的根本就不是你在for循环的时候是用的位置。
delete[] ivs也同样不是new的返回值。所以崩溃是必然的
qiuyu_ts 2011-08-29
  • 打赏
  • 举报
回复
我的ide : dev c++
qiuyu_ts 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ryan_332595319 的回复:]

引用 4 楼 pengzhixi 的回复:
是为delete[]ivs;

+1
方便最后释放new出来的空间..
[/Quote]

问题是现在测试的结果, 无 tp的版本是不对的..

和delete还没扯上关系
qiuyu_ts 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 healer_kx 的回复:]

tp ++了,而ivs 没有++,这就是目的。。。
[/Quote]

有tp和无tp 完全是两种结果..

这是我不明白的地方
仙度瑞城 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pengzhixi 的回复:]
是为delete[]ivs;
[/Quote]
+1
方便最后释放new出来的空间..
qiuyu_ts 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 akirya 的回复:]

int *tp = ivs; //就是这段.. 为什么需要另创建一个指针..??
下面的循环对tp++了 所以需要一个指针保存原始值。
[/Quote]
下面的循环对tp++了 所以需要一个指针保存原始值。

这句话不明白..

---
我调试时看的是, 不创建tp, 那么ivs的指针一直指向在第一个元素. 且在for循环结束后, 第一元素里的值又变为未初始化那种情况差不多..
3 变为 -1xxxxxxx 这样..
仙度瑞城 2011-08-29
  • 打赏
  • 举报
回复
楼上的都是大神...
pengzhixi 2011-08-29
  • 打赏
  • 举报
回复
是为delete[]ivs;
  • 打赏
  • 举报
回复
int *tp = ivs; //就是这段.. 为什么需要另创建一个指针..??
下面的循环对tp++了 所以需要一个指针保存原始值。
healer_kx 2011-08-29
  • 打赏
  • 举报
回复
ivs的指针还是指向 head 的部分。
healer_kx 2011-08-29
  • 打赏
  • 举报
回复
tp ++了,而ivs 没有++,这就是目的。。。

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧