首页 > 解决方案 > 将迭代器移动 N 次 C++

问题描述

我似乎遇到了以下问题:我想从一个容器中获取元素并通过以下方式重新排列其所有者将它们复制到第二个容器:第一个容器的元素顺序为 {e_0, e_1 ...e_N -1} 第二个容器必须有这个顺序 {e_0, e_N-1, e_1, e_N-2, ....} 我正在尝试这样做move_iterator并根据需要推送尽可能多的位置,将元素添加到需要的位置位置,并用元素恢复它base,但是,我无法克服语法。:(
任何帮助将不胜感激

template<class T>
void front_back_pairing(T& inContainer, T& outContainer)
{
    const int N = inContainer.size();
    int steps = 0;

    for(auto it : inContainer){
        int toBeSkipped = N - steps;
        if(steps % 2 == 0){
            outContainer.push_back(it);
        }else{
            // move iterator to desired position
            auto tempIt = move_iterator<it>(inContainer.begin()+toBeSkipped);
            // push it to the second container 
            outContainer.push_back(tempIt);
            // restore the iterator to its base position 
        }
        steps ++;
    }
}

标签: c++iterator

解决方案


你可能会做这样的事情move_iterator

template <class Container>
Container front_back_pairing(Container&& c)
{
    Container res;
    res.reserve(c.size());
    auto it = std::make_move_iterator(c.begin());
    auto rit = std::make_move_iterator(c.rbegin());

    if (c.size() % 2 == 1) {
        while (it.base() != std::prev(rit.base().base())) {
            res.push_back(*it);
            res.push_back(*rit);
            ++it;
            ++rit;
        }
        res.push_back(*it);
    } else {
        while (it.base() != rit.base().base()) {
            res.push_back(*it);
            res.push_back(*rit);
            ++it;
            ++rit;
        }
    }
    return res;
}

演示


推荐阅读