用迭代器和下标不能访问容器中元素

懒得取名888 2019-01-28 05:42:48
vector<int> shu;
vector<int> he2;
auto a = shu.size()-1;
for (auto b = shu.cbegin(); b != shu.cend(); b++)
{
auto c = (*b) + (*(b + a));
cout << *b << endl;
cout << *(b+a)<<endl;
he2.push_back(c);
a=a-1;
cout << a<<endl;
cout << endl;
}

程序如上,shu自己输入(这里没写程序),a就是容器的下标,这个程序实现的是首尾元素求和然后放入he2里面,运行程序*b有变化,a也有变化,但是代码红色部分的结果没有变化,所以就导致程序绿色部分结果错误。

这题目来源C++primer第五版练习3.24

请问这是怎么回事?怎样修改。
...全文
244 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
misar_zm 2019-12-21
  • 打赏
  • 举报
回复
就是因为b和a都有变化,所以 b+a没有变化。举个例子, {0,1,2,3} 初始值b指向0的位置, a=3, 则*(b+3)=3. 然后b++后指向1的位置,a--后等于2, *(b+2)仍然等于3
bluewanderer 2019-01-30
  • 打赏
  • 举报
回复
引用 8 楼 斗牛888 的回复:
[quote=引用 7 楼 bluewanderer 的回复:]
[quote=引用 6 楼 斗牛888 的回复:]
[quote=引用 1 楼 bluewanderer 的回复:]
10个元素,第1个元素往后数9个是第10个,第2个元素往后数8个还是第10个…… 你的b + a一直是同一个元素。

不是太清楚你说“首尾元素求和”。如果是我以为的意思,那么你大概想要的是a -= 2并且你不能这么循环。


对滴,我把a=a-1改成a=a-2后结果达到预期了,但是a的值怎么成乱码了呢?要怎样改循环啊?
[/quote]
本来10个元素只要循环5次,你循环10次自然坏掉了。这种东西一般都是一个头部的索引,一个尾部的索引。每次循环头部索引+1,尾部索引-1,循环到头部比尾部大结束。[/quote]


懂了,但是我把for循环里面判断语句改为b<b+ (a+1) / 2后a还是乱码,难道不是这样改?你的意思不就是b小于容器中间位置就循环吗?我改的是小于中间位置啊。这里面还有个奇偶判断,现在就当容器个数为偶数吧。
[/quote]
就算你这么说,我也不知道你到底怎么个乱码。另外别玩火,虽然不算是错误,但你这么干会导致a下溢。其实我怀疑你以为的乱码就是a下溢导致的。
bluewanderer 2019-01-29
  • 打赏
  • 举报
回复
引用 6 楼 斗牛888 的回复:
[quote=引用 1 楼 bluewanderer 的回复:]
10个元素,第1个元素往后数9个是第10个,第2个元素往后数8个还是第10个…… 你的b + a一直是同一个元素。

不是太清楚你说“首尾元素求和”。如果是我以为的意思,那么你大概想要的是a -= 2并且你不能这么循环。


对滴,我把a=a-1改成a=a-2后结果达到预期了,但是a的值怎么成乱码了呢?要怎样改循环啊?
[/quote]
本来10个元素只要循环5次,你循环10次自然坏掉了。这种东西一般都是一个头部的索引,一个尾部的索引。每次循环头部索引+1,尾部索引-1,循环到头部比尾部大结束。
懒得取名888 2019-01-29
  • 打赏
  • 举报
回复
引用 1 楼 bluewanderer 的回复:
10个元素,第1个元素往后数9个是第10个,第2个元素往后数8个还是第10个…… 你的b + a一直是同一个元素。

不是太清楚你说“首尾元素求和”。如果是我以为的意思,那么你大概想要的是a -= 2并且你不能这么循环。


对滴,我把a=a-1改成a=a-2后结果达到预期了,但是a的值怎么成乱码了呢?要怎样改循环啊?
独孤过 2019-01-29
  • 打赏
  • 举报
回复
前后双向迭代

#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>

const int N = 100;

int main()
{
	std::vector<int> shu;
	std::vector<int> he2;
	for (int i = 1; i <= N; ++i)
		shu.push_back(i);
	he2.reserve(shu.size());
	auto forward = shu.cbegin();
	auto backward = shu.crbegin();
	for (; forward != shu.cend() && backward != shu.crend(); ++forward, ++backward)
	{
		auto temp = *forward + *backward;
		std::cout << *forward << ' ' << *backward << ' ' << temp << std::endl;
		he2.push_back(temp);
	}
	std::copy(he2.cbegin(), he2.cend(), std::ostream_iterator<int>(std::cout, " "));
	return 0;
}
棉猴 2019-01-29
  • 打赏
  • 举报
回复
for循环语句中b++,而for循环体中a--,所以b+a始终不变啊
懒得取名888 2019-01-29
  • 打赏
  • 举报
回复
引用 7 楼 bluewanderer 的回复:
[quote=引用 6 楼 斗牛888 的回复:]
[quote=引用 1 楼 bluewanderer 的回复:]
10个元素,第1个元素往后数9个是第10个,第2个元素往后数8个还是第10个…… 你的b + a一直是同一个元素。

不是太清楚你说“首尾元素求和”。如果是我以为的意思,那么你大概想要的是a -= 2并且你不能这么循环。


对滴,我把a=a-1改成a=a-2后结果达到预期了,但是a的值怎么成乱码了呢?要怎样改循环啊?
[/quote]
本来10个元素只要循环5次,你循环10次自然坏掉了。这种东西一般都是一个头部的索引,一个尾部的索引。每次循环头部索引+1,尾部索引-1,循环到头部比尾部大结束。[/quote]


懂了,但是我把for循环里面判断语句改为b<b+ (a+1) / 2后a还是乱码,难道不是这样改?你的意思不就是b小于容器中间位置就循环吗?我改的是小于中间位置啊。这里面还有个奇偶判断,现在就当容器个数为偶数吧。
独孤过 2019-01-28
  • 打赏
  • 举报
回复
仅供参考:

#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>

const int N = 100;

int main()
{
	std::vector<int> shu;
	std::vector<int> he2;
	for (int i = 1; i <= N; ++i)
		shu.push_back(i);
	auto size = shu.size();
	he2.reserve(size);
	for (decltype(size) index = 0, end = size; index < end; ++index)
	{
		auto temp = shu[index] + shu[--size];
		std::cout << shu[index] << ' ' << shu[size] << ' ' << temp << std::endl;
		he2.push_back(temp);
	}
	std::copy(he2.cbegin(), he2.cend(), std::ostream_iterator<int>(std::cout, " "));
	return 0;
}
懒得取名888 2019-01-28
  • 打赏
  • 举报
回复
引用 1 楼 bluewanderer的回复:
10个元素,第1个元素往后数9个是第10个,第2个元素往后数8个还是第10个…… 你的b + a一直是同一个元素。

不是太清楚你说“首尾元素求和”。如果是我以为的意思,那么你大概想要的是a -= 2并且你不能这么循环。
首尾求和是指,第一个元素加最后一个元素,第二个元素加倒数第二个元素,第三个元素加倒数第三个元素,以此类推。
bluewanderer 2019-01-28
  • 打赏
  • 举报
回复
10个元素,第1个元素往后数9个是第10个,第2个元素往后数8个还是第10个…… 你的b + a一直是同一个元素。

不是太清楚你说“首尾元素求和”。如果是我以为的意思,那么你大概想要的是a -= 2并且你不能这么循环。

64,648

社区成员

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

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