c++ - 使用 c++11 range-based-for-loop 搜索插入位置

标签 c++ c++11 for-loop

我想知道是否可以使用 c++11 ranged-based-for-loop 语法来搜索稍后在列表中使用的插入点。我可以使用 c++11 ranged-based- 以某种方式压缩 for (auto i = l.begin(); i != l.end(); i++) for-loop 语法代替?

#include <iostream>
#include <list>

int main(int argc, char **argv) {

    std::list<int> l = { 1, 2, 3, 5};

    for (auto i = l.begin(); i != l.end(); i++) {
        if (*i == 3) {
            l.insert(i, 4);
            break;
        }
    }

    for (auto &i : l) {
       std::cout << " " << i;
    }
};

在伪代码中是这样的:

for (auto &i : l) {
    if (i == 3) {
        l.insert(some_magic_opertor(i), 4);
        break;
    }
}

或伪代码:

typedef std::list<int>::iterator it;
for (it i : l) {
    if (*i == 3) {
        l.insert(i, 4);
        break;
    }
}

最佳答案

这只有在您创建自己的奇特迭代器适配器时才有可能实现,该适配器将在取消引用时返回底层迭代器:

template <typename Iterator>
class exposed_iterator
{
public:
    exposed_iterator(Iterator it)
        : m_iterator(std::move(it)) { }
    Iterator &operator*()
    {
        return m_iterator;
    }

    exposed_iterator & operator++()
    {
        ++m_iterator;
        return *this;
    }

    bool operator!=(const exposed_iterator &that) const
    {
        return m_iterator != that.m_iterator;
    }

private:
    Iterator m_iterator;
};

然后提供一个函数和标准 range 类中不方便的缺失,以在基于范围的 for 循环中使用:

template <typename Iterator>
struct range //struct for the sake of simplicity
{
    Iterator m_begin;
    Iterator m_end;

    Iterator begin() const { return m_begin; }
    Iterator end() const { return m_end; }
};

template <typename Container, typename Iterator = typename Container::iterator>
range<exposed_iterator<Iterator>> expose(Container &container)
{
    return { container.begin(), container.end() };
}

然后按如下方式使用所有这些机器:

std::list<int> l = { 1, 2, 3, 5};
for (auto &&it : expose(l)) {
    if (*it > 3) {
        l.insert(it, 4);
        break;
    }
}

关于c++ - 使用 c++11 range-based-for-loop 搜索插入位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51342721/

相关文章:

c++ - C++ 中的 IF 循环行为

c++ - 访问 C++ 变量时如何解析其内容?

c# - 在C#中,每次都会评估循环声明吗?

c++ - 如何将 std::<list>::reverse_iterator 与运算符 + 一起使用?

javascript - 在 for 循环中每两个 block 打印数字

java - 从 ArrayList 中删除一个元素

c++ - 在 C++ 中使用指针更改字符串值

c++ - 来自 shared_ptr 的类型转换错误

c++ - 从作为模板参数传递给构造函数的类继承并从它们继承

c++ - 没有模板的运算符重载