【问题标题】:Why is this iterator arithmetic not working?为什么这个迭代器算法不起作用?
【发布时间】:2020-12-23 16:15:22
【问题描述】:

我学习 C++ 是为了好玩。我试图理解迭代器算术并编写了一个简单的程序,它将向量中的第一个元素与最后一个元素相加。接下来将第二个和倒数第二个元素相加。该过程一直持续到所有元素都以这种方式求和为止。

问题似乎与我的代码的*(a.end() - 1 - it) 部分有关。如果我删除- it,那么我会得到我期望的结果。添加- it 会导致错误提示

存在构建错误。是否要继续运行上次成功的构建?

我从 Visual Studio 收到的错误如下;

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

Error message

Error list

【问题讨论】:

  • iterator - iterator 给出距离,而不是迭代器。
  • 如果您遇到编译器错误,为什么您没有在这个问题中包含确切的错误?
  • 感谢您添加错误,它好多了。请注意,不幸的是,每个人都不容易阅读图像。您能否将错误消息的文本添加到问题中?只需“indirection requires ...”这一行就可以了。 另外拥有图像也很好。
  • 感谢您添加文字,这个问题现在很好。我已经稍微编辑了它以改进格式。当然还有其他方法可以做到这一点,但这可以给你一些想法。

标签: c++ iterator


【解决方案1】:

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

【讨论】:

  • 谢谢你。你的回复很有帮助。我相信我明白我的想法哪里出了问题。再次感谢。
  • @AdamsK 没问题。正如对您的问题的评论中提到的,您缺少编译器错误消息。请将其添加到问题中,以使问题更有用,并符合网站规则。
  • @fabian 当然,有多种方法可以使代码更具可读性。但是,如果不进行基准测试并首先对代码进行分析,我不会声称任何版本都比另一个版本性能更高。
【解决方案2】:

您应该像这样更改代码:

auto fix = it - a.begin();

cout &lt;&lt; (*it) + *(a.end() - 1 - fix) &lt;&lt; endl;

你不能像整数这样对迭代器进行操作,你可以简单地添加或子整数或使用 begin() 的起点 - 因为 end() 不是向量中某个值的真实指针。

【讨论】:

    猜你喜欢
    • 2010-10-20
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    相关资源
    最近更新 更多