提问者:小点点

移动迭代器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 ++;
    }
}

共1个答案

匿名用户

您可以使用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;
}

演示

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(迭代|器|n|次|c++)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?