我想在容器内的任何位置向左或向右移动元素。移位元件不连续。
例如,我有一个向量 {1,2,3,4,5,6,7,8},我想将 {4,5,7} 向左移动 2 个位置,预期结果将是 {1,4 ,5,2,7,3,6,8}
有没有优雅的方法来解决它?
我想在容器内的任何位置向左或向右移动元素。移位元件不连续。
例如,我有一个向量 {1,2,3,4,5,6,7,8},我想将 {4,5,7} 向左移动 2 个位置,预期结果将是 {1,4 ,5,2,7,3,6,8}
有没有优雅的方法来解决它?
您可以编写自己的移位函数。这是一个简单的:
#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);
}
然后你可以像这样使用它:
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}
这是一个幼稚的实现,因为当移动多个元素时,find
会在容器的开头进行多次迭代。此外,它假设每个元素都是唯一的,但情况可能并非如此。但是,我希望它能给你一些关于如何实现你需要的提示。
你不能做一个简单的插入然后擦除吗?
不要忘记,您将使任何引用高于删除点或插入点的元素的迭代器无效,以最低者为准。
高温高压
干杯,
抢