gpt4 book ai didi

c++ - 使用迭代器仅在某些索引处访问值

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:37:02 25 4
gpt4 key购买 nike

我无法理解 std::accumulate。它可以用于将 vector 中偶数索引处的值相加吗?

int rob(vector<int>& nums) {

int a = std::accumulate(nums.begin(), nums.end(), 0);

std::cout <<" a: " <<a;
return a;

}

所以如果我有一个vector y = {1, 2, 3, 4}

我如何更改上面的代码,以便 std::accumulate 仅迭代索引 [0] 和 [2]。这甚至可以使用 std::accumulate 吗?

最佳答案

您有几个选择。快速且(真正)肮脏的方法是遍历整个集合,并调用一个跟踪当前索引的函数,并忽略奇数索引处的值。它有效,但它充其量是丑陋的,更重要的是,它在相当基本的层面上是错误的,迫使本应是累加函数的东西承担进行迭代的责任。简而言之,这与其说是一个解决方案,不如说是一个问题。

干净的方法是认识到访问集合中的所有其他项目实际上是关于迭代,而不是关于特定算法(std::accumulate 或任何其他)。所以我们应该在这里使用的是一个访问我们想要访问的项目的迭代器。这是一个最小的实现:

#include <vector>
#include <iterator>
#include <iostream>
#include <numeric>

template <class Iterator>
class n_iterator {
Iterator i;
size_t n;
public:
// We construct this iterator from some other iterator, plus a "step" value
// to tell us how many items to skip forward when `++` is applied.
n_iterator(Iterator i, size_t n) : i(i), n(n) {}

// When you dereference this iterator, it's equivalent to dereferencing
// the underlying iterator.
typename std::iterator_traits<Iterator>::value_type operator *() { return *i; }

// ...but when you increment it, you move ahead N places instead of 1.
n_iterator &operator++() { std::advance(i, n); return *this; }

// iterator comparisons just compare the underlying iterators.
bool operator==(n_iterator const &other) const { return i == other.i; }
bool operator!=(n_iterator const &other) const { return i != other.i; }
};

int main() {
std::vector<int> y { 1, 2, 3, 4};
auto total = std::accumulate(y.begin(), y.end(), 0);

std::cout << "total: " << total << "\n";

auto skip_total = std::accumulate(n_iterator(y.begin(), 2), n_iterator(y.end(), 2), 0);

std::cout << "Skipped total: " << skip_total << "\n";
}

此实现似乎足以让 g++ 7.1 编译代码,但对于实际使用,您可能应该为迭代器实现整个接口(interface)(例如,至少,它应该真正具有 value_typereference 等的定义。 )

目前,这也只提供一个前向迭代器,而不考虑底层迭代器。根据情况(和底层迭代器的类别),您还可以支持双向和/或随机迭代。

关于c++ - 使用迭代器仅在某些索引处访问值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58240433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com