c – 我可以从基于循环的范围内获取项目的索引吗?

c – 我可以从基于循环的范围内获取项目的索引吗?,第1张

概述我已经定义了一个像这样的指针deque: std::deque<BoardSquare *> mydeque; 我想在我的双端队列中使用基于范围的循环: for (BoardSquare * b : mydeque) { // do something involving the index of b} 是否有可能从基于循环的范围内获取项目的索引? 我提出了一个解决方案 – 或者说是一 我已经定义了一个像这样的指针deque:

std::deque<BoardSquare *> mydeque;

我想在我的双端队列中使用基于范围的循环:

for (BoardSquare * b : mydeque) {    // do something involving the index of b}

是否有可能从基于循环的范围内获取项目的索引?

解决方法 我提出了一个解决方案 – 或者说是一个实验性解决方案.以下是您最终将如何使用它:

for(auto item : make_indexable(v)){      //std::get<0>(item) is the index      //std::get<1>(item) is the object}

这里是最小的实现(它只是为了演示基本的想法):

#include <tuple>#include <functional>template<typename C>struct indexed_container{    struct indexed_iterator    {        typedef typename C::value_type value_type;        typedef std::tuple<size_t,std::reference_wrapper<value_type>> tuple_type;        typename C::iterator _it;        size_t _index;        indexed_iterator(typename C::iterator it) : _it(it),_index(0) {}        indexed_iterator& operator++()        {            ++_it;            ++_index;            return *this;        }        bool operator == (indexed_iterator const & other)        {            return _it == other._it;        }        bool operator != (indexed_iterator const & other)        {            return _it != other._it;        }        tuple_type operator*()        {            return std::make_tuple(_index,std::ref(*_it));        }    };    indexed_container(C & c) : _c(c) {}    indexed_iterator begin()    {        return indexed_iterator(_c.begin());    }    indexed_iterator end()    {        return indexed_iterator(_c.end());    }private:    C & _c;};template<typename C>auto make_indexable(C & c) -> indexed_container<C>{    return indexed_container<C>(c); }

测试代码:

#include <iostream>#include <vector>int main(){    std::vector<int> v{1,2,3};    for(auto item : make_indexable(v))    {        std::cout << std::get<0>(item) << " => " << std::get<1>(item) << std::endl;        std::get<1>(item) *= 10; //modify value!    }    std::cout << "\nModifIEd\n";    for(auto item : make_indexable(v))    {        std::cout << std::get<0>(item) << " => " << std::get<1>(item) << std::endl;    }}

输出:

0 => 11 => 22 => 3ModifIEd0 => 101 => 202 => 30

Online demo

请注意,此解决方案并不完美,因为它不适用于临时和const容器(以及const对象的容器).此外,即使您编写自动项而不是auto&,也会立即返回基础对象作为参考. item(事实上,你不能写auto& item).但我认为这些问题可以通过更多努力和精心设计来解决.毕竟,这只是一个基本想法的示范.

总结

以上是内存溢出为你收集整理的c – 我可以从基于循环的范围内获取项目的索引吗?全部内容,希望文章能够帮你解决c – 我可以从基于循环的范围内获取项目的索引吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1223311.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存