与 std::minmax_element 一起使用的步长/步长迭代器

2024-02-11

我有一个一维浮点数组,它表示 m *n (行和列)浮点值表。我的要求是为每行和每列找到一个最小/最大元素。对于行,我可以通过使用 std::minmax_element 指定 n 个元素的范围来轻松完成此操作。但对于列,我需要使用步幅迭代器,因为放置的元素不是连续的,而是以 n 的步长间隔放置。 boost/STL中有没有标准的迭代器可以使用。另一种选择是编写我自己的版本。 最好的课程是什么?


有两种方法(其中很多)是使用range-v3 https://github.com/ericniebler/range-v3 (or boost::range http://www.boost.org/doc/libs/1_61_0/libs/range/doc/html/index.html) and boost::iterator http://www.boost.org/doc/libs/1_61_0/libs/iterator/doc/index.html.


With range-v3,这是立即的:

#include <iostream>
#include <range/v3/all.hpp>

using namespace ranges;

int main() {
    std::vector<std::size_t> src{1, 2, 3, 4, 5, 6, 7};
    const auto min_max = minmax(src | view::stride(3));
    std::cout << min_max.first << " " << min_max.second << std::endl;
}

In boost::range, use boost::adaptors::strided http://www.boost.org/doc/libs/1_46_1/libs/range/doc/html/range/reference/adaptors/reference/strided.html.

#include <boost/range/adaptor/strided.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <boost/assign.hpp>
#include <boost/range/algorithm.hpp>
#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
    using namespace boost::adaptors;
    using namespace boost::assign;

    std::vector<int> input;
    int arr[] = {1, 2, 3, 4, 5, 6, 7};

    auto str = std::make_pair(&arr[0], &arr[8]) | strided(3);
    std::cout << *boost::range::min_element(str) << " " << *boost::range::max_element(str) << std::endl;
}

请注意以下事项:

  1. 范围可以由一对迭代器定义,因此我在这里使用了它,尽管可以使用更简单的形式(它适合堆分配的 C 样式数组的用例)。

  2. 不幸的是,这个子库似乎没有min-max(或者至少我找不到它),所以有两个调用,一个用于min,一个用于max。


给定一个随机访问迭代器,构建一个跨步前进并不是很困难boost::iterator_facade http://www.boost.org/doc/libs/1_54_0/libs/iterator/doc/iterator_facade.html:

#include <iostream>
#include <vector>
#include <iterator>
#include <cstddef>
#include <algorithm>
#include <boost/iterator/iterator_facade.hpp>

template<typename It>
class stride_iterator :
    public boost::iterator_facade<
        stride_iterator<It>,
        typename std::iterator_traits<It>::value_type,
        boost::forward_traversal_tag> {
public:
    stride_iterator() = default;
    stride_iterator(It it, It end_it, std::size_t stride) : 
        m_it{it}, m_end_it{end_it}, m_stride{stride} 
    {}

private:
    friend class boost::iterator_core_access;

    void increment() { 
        if(std::distance(m_it, m_end_it) < m_stride) {
            m_it = m_end_it;
            return;
        }
        std::advance(m_it, m_stride);
    }

    bool equal(const stride_iterator<It> &other) const {
        return m_it == other.m_it;
    }

    typename std::iterator_traits<It>::value_type &dereference() const { 
        return *m_it; }

    It m_it, m_end_it;
    std::size_t m_stride;
};

这应该足够了std::minmax_element。 (添加一点逻辑,decrement and advance成员,并更改标签,也会使其成为随机访问迭代器。)

int main() {
    using vec_t = std::vector<int>;
    vec_t v{1, 2, 3, 4, 5, 6, 7};
    stride_iterator<vec_t::iterator> b{std::begin(v), std::end(v), 3}, e{std::end(v), std::end(v), 3};
    auto min_max = std::minmax_element(b, e);
    std::cout << *min_max.first << " " << *min_max.second << std::endl;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与 std::minmax_element 一起使用的步长/步长迭代器 的相关文章

随机推荐

  • 环境错误:Gmsh 版本必须 >= 2.0

    我是 fipy 的新手 所以如果我问一些应该显而易见的问题 请原谅我的无知 但我无法运行已经存在的 并且在其他机器上工作的 脚本 无法获取EnvironmentError Gmsh version must be gt 2 0 我可能在安装
  • 使用 exec 中的动态 SQL - exec 终止所有用户会话

    环境 SQL Server 2005 2008 我想使用动态 SQL 终止特定数据库上的所有用户连接 我知道其他方法 例如将数据库模式更改为单一 离线等 但希望使用动态 SQL 我试图避免游标 while 循环以及在执行动态 SQL 时使用
  • Julia 中“检测到包的要求无法满足”

    我在向 Julia 添加包时遇到错误 Error 数据框 v1 5 pkg gt add DataFrames Updating registry at C Users julia registries JuliaComputingRegi
  • C99 printf 中的可变前导零

    我正在用 C99 编写一个多精度库 根据编译代码的平台 我选择不同的表示基础 因此 举例来说 假设在平台 X 上系统选择 BASE 100 并且在平台上Y BASE 10000 假设我代表大无符号整数 如下所示 typedef struct
  • 如何测量用于 .NET 远程处理的 IP 端口输入/输出的字节数?

    我正在使用 NET 远程处理将定期状态更新从 Windows 服务检索到 控制器 应用程序中 该应用程序用于显示有关服务正在执行的操作的一些实时统计信息 由此产生的网络流量非常巨大 是更新数据大小的很多倍 所以很明显 我以一种非常低效的方式
  • 无法弄清楚这个“被调用的对象不是函数”C 时间错误

    因此 对于我的学校作业的一部分 我需要找到当前时间 我用它作为参考 http www cplusplus com reference ctime localtime http www cplusplus com reference ctim
  • 在 Less 中连接字符串

    我认为这是不可能的 但我想我问是否有办法 我的想法是 我有一个用于 Web 资源文件夹路径的变量 root img file test css url root file px background image url url 我得到这个结
  • 以编程方式调节 Windows 7 计算机上的音量

    我想知道是否可以使 Tkinter 比例与计算机的音量相对应 换句话说 通过拖动比例尺 电脑的音量会不会变大 这只是我编写的一些随机代码 我正在运行 64 位 Windows 7 操作系统 1 from Tkinter import 2 3
  • constexpr 数组成员是编译时常量吗?

    是代码片段 struct Parameters static constexpr int n 2 static constexpr double v n 4 0 5 0 合法的 C 11 如果是的话 是Parameters v 0 and
  • 使用 ANTLR 解析循环

    我想使用 ANTLR 解析一个简单的类似 matlab 的 for 循环 循环就像 for i 1 8 y i a i i end 我想解析循环并解析8次y i a i i语句 以便对每个语句执行一些操作 我的规则如下 操作在 C 中描述
  • 有没有办法冻结 ES6 Map?

    我正在寻找一种冻结原生 ES6 地图的方法 Object freeze https developer mozilla org en US docs Web JavaScript Reference Global Objects Objec
  • Swift - 交付应用程序上的本地通知图标徽章编号更新在后台

    我试图弄清楚如何在传递本地通知时动态更新图标徽章编号 在安排时注册徽章号码不是一个选项 因为如果我在发送任何通知之前注册两个或多个通知 UIApplication shared applicationIconBadgeNumber this
  • web.config 文件何时“执行”?

    每次加载网站上的页面时 服务器都会执行 读取它吗 创建应用程序时 web config 会加载到内存中 这通常是对应用程序中页面 资源的第一个请求 IIS ASP NET 监视 web config 的更改 如果发生更改 将重新启动您的应用
  • 如何在 ggplot 背景(而不是面板)上添加图像?

    如何使用图像作为 ggplot2 绘图的背景 例如 代码 mtcars gt ggplot aes cyl geom bar theme plot background element rect fill black It results
  • 如何为 rsync SSH 命令自动传递密码?

    我需要去做rsync by ssh并希望自动执行此操作 而无需传递密码ssh手动 使用 sshpass 非交互式 ssh 密码提供程序实用程序 在Ubuntu上 sudo apt get install sshpass rsync 命令 u
  • 开始使用 RxJava 和 sqlite

    我正在学习 RxJava 并且已经阅读了几篇文章和视频 我对 RxJava 所提供的功能感到非常敬畏 所以我认为目前已经了解了响应式编程的全部内容 Dan Lew 的本教程 http blog danlew net 2014 09 15 g
  • mysqldump - 将多个数据库从单独的 mysql 帐户转储到一个文件

    我使用的标准 mysqldump 命令是 mysqldump opt databases dbname host dbhost user dbuser password dbpass gzip gt filename 转储多个数据库 mys
  • 通过performSelectorOnMainThread调用方法与普通方法调用

    谁能告诉我当我使用调用方法时有什么不同performSelectorOnMainThread并在没有执行选择器的情况下调用相同的方法 For Exa void sampleCALL 现在使用这两个场景调用此方法 self performSe
  • 动画播放与否取决于链接动画的animationRepeatCount

    我对 iOS 完全陌生 我正在开发一个具有许多帧动画的应用程序 一切都很顺利 直到我尝试用下面发布的方法制作最终动画 该方法是分配给内置文本到语音合成器的委托 func speechSynthesizer synthesizer AVSpe
  • 与 std::minmax_element 一起使用的步长/步长迭代器

    我有一个一维浮点数组 它表示 m n 行和列 浮点值表 我的要求是为每行和每列找到一个最小 最大元素 对于行 我可以通过使用 std minmax element 指定 n 个元素的范围来轻松完成此操作 但对于列 我需要使用步幅迭代器 因为