首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能否以非连续的方式使用Boost.Range索引适配器?

我能否以非连续的方式使用Boost.Range索引适配器?
EN

Stack Overflow用户
提问于 2015-06-18 12:21:19
回答 1查看 544关注 0票数 2

我试图遍历一个列表,根据共享索引的另一个列表的值更新每个元素。

理想情况下,我希望使用这样的for-range循环来完成这个任务:

代码语言:javascript
复制
std::vector<int> is;
std::vector<int> other_list;

for (auto &i : is | boost::adaptors::indexed(0)) {
  i.value() = other_list[i.index()];
}

但我遇到了这样的错误:

代码语言:javascript
复制
indexed.cpp:29:48: error: invalid initialisation of non-const reference of type 'boost::range::index_value<int&, long int>&' from an rvalue of type 'boost::iterator_facade<boost::range_detail::indexed_iterator<__gne_cxx::__normal_iterator<int*, std::vector<int> > >, boost::range::index_value<int&, long int>, boost::random_access_traversal_tag, boost::range::index_value<int&, long in>, long int>::reference {aka boost::range::index_value<int&, long int>}'

我所追求的是Boost.Range不可能实现的,还是我做错了?

NB:,我也用boost::combine试了一下,结果没什么好运气。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-18 12:30:55

indexed有点滑稽,因为它给出了元素具有value()index()的范围,而不是它们本身是值。关键是您实际上不需要引用indexed元素,因为value()本身是可修改的。

例如,如果我要更改示例Boost提供:

代码语言:javascript
复制
int main(int argc, const char* argv[])
{
    using namespace boost::assign;
    using namespace boost::adaptors;

    std::vector<int> input = {10, 20, 30, 40, 50};
    for (const auto& element : input | indexed(0))
    {
        element.value() = 1;
    }

    for (int i : input) {
        std::cout << i << ' ';
    }

    return 0;
}

element可能是对const的引用,但我仍然可以更改所有的值。

但是,如果input是一个const范围,那么value()本身就是对const的引用,因此不会编译。正如你所期望的那样。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30915215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档