如何解决为什么这个迭代器算法不起作用?
我学习 C++ 是为了好玩。我试图理解迭代器算法,并编写了一个简单的程序,将向量中的第一个元素与最后一个元素相加。接下来,将第二个和倒数第二个元素相加。这个过程一直持续到所有元素都以这种方式相加。
问题似乎出在我代码的 *(a.end() - 1 - it)
部分。如果我删除 - it
,那么我会得到我期望的结果。添加 - it
会导致错误提示
存在构建错误。您想继续运行上次成功的构建吗?
E0075 *
的操作数必须是指针
C2100 非法间接访问
我已经以不同的方式解决了这个问题,并且能够实现我的目标。我的问题是为什么这段代码是一个错误,是否可以稍微修改一下以正确执行?
我感谢任何建议。
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
int main()
{
vector<int> a{1,2,3,4,5,6,7,8,9,10};
for (auto it = a.begin(); it != a.begin() + (a.end() - a.begin()) / 2; ++it)
cout << (*it) + *(a.end() - 1 - it) << endl;
return 0;
} // END MAIN
解决方法
用 a.end() - 1 - it
减去 2 个迭代器可以得到它们之间的距离。您无法使用 *
取消引用距离,因此会出现编译器错误。
表达式中需要从 a.begin()
到您想要获取的元素的距离。您可以通过将 a.begin()
添加到该距离来稍微调整表达式:
cout << (*it) + *(a.end() - 1 - it + a.begin()) << endl;
// ^^^^^^^^^^^
这是一个 demo。
从 C++20 开始,你可以直接处理范围,而不是处理迭代器和操作它们,一旦你习惯了它会更容易阅读:
// just for convenience
namespace sv = std::views;
namespace sr = std::ranges;
// size of half the range
auto half = a.size() / 2;
sr::transform(a | sv::take(half),// first half
a | sv::reverse | sv::take(half),// second half reversed
std::ostream_iterator<int>(std::cout,"\n"),// print out
std::plus{}); // the sum
这是一个 demo。
,您应该像这样更改代码:
auto fix = it - a.begin();
cout << (*it) + *(a.end() - 1 - fix) << endl;
你不能像整数一样操作迭代器,你只能简单地添加或子整数或使用 begin() 的起点 - 因为 end() 不是向量中某个值的真正指针。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。