如何使用 std::move_iterator 从向量中删除元素?

问题描述 投票:0回答:1

这是一个约瑟夫斯排列问题,它是通过使用

std::move()
解决的,但现在我必须切换到使用
std::move_iterator
(通过使用
std::make_move_iterator()
) 但是,这不能编译:

template <typename RandomIt>
void MakeJosephusPermutation(RandomIt first, RandomIt last, uint32_t step_size) {
    list<typename RandomIt::value_type> pool;
    for (auto it = make_move_iterator(first); it != make_move_iterator(last); ++it) {
        pool.push_back(*it);
    }
    auto cur_pos = make_move_iterator(pool.begin());
    while (!pool.empty()) {
        *(first++) = *cur_pos;
        if (pool.size() == 1) {
            break;
        }
        const auto next_pos = LoopIterator(pool, next(cur_pos));

        pool.erase(cur_pos); //-> *"No matching member function for call to 'erase'"

        cur_pos = next_pos;
        for (uint32_t step_index = 1; step_index < step_size; ++step_index) {
            cur_pos = LoopIterator(pool, next(cur_pos));
        }
    }
}

我在 cppreference 上找不到这方面的信息,在这种情况下如何从向量中删除元素? IE。我知道该元素将被移动,但没有某种“擦除”会扰乱算法......

c++ iterator erase stdmove
1个回答
0
投票

std::list<T>::erase()
接受类型为
std::list<T>::const_iterator
std::list<T>::iterator
的参数。请参阅:https://en.cppreference.com/w/cpp/container/list/erase

您尝试使用类型为

std::move_iterator<Iter>
的参数调用擦除,但不支持将其转换为列表迭代器类型之一:https://en.cppreference.com/w/cpp/iterator/move_iterator

您应该访问基本迭代器来调用擦除:

pool.erase(cur_pos.base());
© www.soinside.com 2019 - 2024. All rights reserved.