我想知道是否可以使用 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/