How can I shift elements inside STL container

前端 未结 2 487
你的背包
你的背包 2020-12-18 05:25

I want to shift elements inside container on any positions to the left or right. The shifting elements are not contiguous.

e.g I have a vector {1,2,3,4,5,6,7,8} and

相关标签:
2条回答
  • 2020-12-18 05:42

    You can write your own shifting function. Here's a simple one:

    #include <iterator>
    #include <algorithm>
    
    template <typename Container, typename ValueType, typename Distance>
    void shift(Container &c, const ValueType &value, Distance shifting)
    {
        typedef typename Container::iterator Iter;
    
        // Here I assumed that you shift elements denoted by their values;
        // if you have their indexes, you can use advance
        Iter it = find(c.begin(), c.end(), value);
        Iter tmp = it;
    
        advance(it, shifting);
    
        c.erase(tmp);
    
        c.insert(it, 1, value);
    }
    

    You can then use it like that:

    vector<int> v;
    // fill vector to, say, {1,2,3,4,5}
    shift(v, 4, -2); // v = {1,4,2,3,5}
    shift(v, 3, 1); // v = {1,4,2,5,3}
    

    This is a naive implementation, because when shifting multiple elements, find will iterate many times on the beginning of the container. Moreover, it assumes that every element is unique, which might not be the case. However, I hope it gave you some hints on how to implement what you need.

    0 讨论(0)
  • 2020-12-18 05:44

    Can't you do a simple insert and then erase?

    Don't forget that you'll invalidate any iterators that refer to elements above the removal or insertion point, whichever is lowest.

    HTH

    cheers,

    Rob

    0 讨论(0)
提交回复
热议问题