c++ - std::search 提取当前迭代器并使用 std::advance 向前移动迭代器

标签 c++ c++11 stl

我有一个函数,它利用 std::search 来查看从头到尾提供的某个内存区域并找到某个字节模式。但是,在某些情况下,我想跳过该区域的一部分,而不是从头到尾逐字节地迭代它。例如,从当前迭代器位置向前移动 50 个字节或类似的内容。有没有办法提取当前迭代器对象并使用 std::advance 向前移动迭代器?

const auto address = std::search( address_start, address_end, byte_pattern.cbegin(), byte_pattern.cend(),
    []( const uint8_t &current_byte, const memory::byte_t &pattern_byte ) { 
        // address of current byte in memory
        // this is also the current position of the search itterator
        const auto data = &current_byte;

        if( CERTAIN CONDITION ) {
            MOVE ITTERATOR FORWARD SO THAT WE MOVE FORWARD IN MEMORY WE ARE SCANNING BETWEEN [address_start, address_end]

        }

        return pattern_byte.compare( current_byte );
    }
);

最佳答案

无法访问标准库算法内部使用的迭代器。如果您需要对迭代进行更多控制,那么您必须手动使用迭代器。

cppreference.com向您展示标准库算法的可能实现。只需将它们复制/粘贴到您的代码中并根据需要进行调整即可。例如,对于 std::search() ,它显示了这个实现:

template<class ForwardIt1, class ForwardIt2, class BinaryPredicate>
constexpr ForwardIt1 search(ForwardIt1 first, ForwardIt1 last,
          ForwardIt2 s_first, ForwardIt2 s_last,
          BinaryPredicate p)
{
    for (; ; ++first) {
        ForwardIt1 it = first;
        for (ForwardIt2 s_it = s_first; ; ++it, ++s_it) {
            if (s_it == s_last) {
                return first;
            }
            if (it == last) {
                return last;
            }
            if (!p(*it, *s_it)) {
                break;
            }
        }
    }
}

根据需要更改++s_it

关于c++ - std::search 提取当前迭代器并使用 std::advance 向前移动迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59573613/

相关文章:

c++ - 如何确保 std::map 已订购?

c++ - std::unique 可以用来确定自定义类的对象是否具有相同的值吗?

c++ - c 中的埃拉托色尼筛

c++ - 短程序错误。 C++ 新手,Adafruit LED 灯条,Arduino

c++ - 如何告诉 scons 使用 C++11 标准

c++ - STL 容器和指针的奇怪行为

C++重载->,它是如何工作的?

c++ - 在 C/C++ 中查找可用的网络接口(interface)?

c++ - CMake 链接库 (.a/.so)

C++ 文本文件 I/O