C++ 在向量中移动项目

C++ 在向量中移动项目,c++,C++,将向量中的项从第四位置移动到第二位置的最有效方法是什么。在这种情况下,向量可以包含100多个元素。移动元素的算法应基于迭代器或索引(即查找元素(源)和第二元素(目标)中的4个元素),哪一个更好。我已经尝试过基于索引(在我的例子中,获得第四和第二位置的迭代器比计算索引更容易。我相信您可以使用std::rotate达到这一目的 vector<T> vec = ... vector<T>::iterator from = ... vector<T>::iterato

将向量中的项从第四位置移动到第二位置的最有效方法是什么。在这种情况下,向量可以包含100多个元素。移动元素的算法应基于迭代器或索引(即查找元素(源)和第二元素(目标)中的4个元素),哪一个更好。我已经尝试过基于索引(在我的例子中,获得第四和第二位置的迭代器比计算索引更容易。

我相信您可以使用
std::rotate
达到这一目的

vector<T> vec = ...
vector<T>::iterator from = ...
vector<T>::iterator to = ...
if(from < to ) {
    rotate(from, from+1, to+1);
} else if (from > to) {
    rotate(to, from, from+1);
}
向量向量=。。。 vector::iterator from=。。。 向量::迭代器到=。。。 如果(从<到){ 旋转(从、从+1到+1); }否则如果(从>到){ 旋转(到、从、从+1); } 免责声明:未经测试的代码

顺便说一句,你可以很容易地用eg从迭代器中得到向量索引

vector<T> vec = ...
vector<T>::iterator it = ...
size_t idx = it - vec.begin();
向量向量=。。。 向量::迭代器it=。。。 size_t idx=it-vec.begin();
在这种情况下,向量可能不是合适的数据结构。一个链表。如果它是原语/吊舱的向量,您可以将移动的元素复制到临时位置,使用
memmove
,然后将元素复制到其目标位置。
std::swap(vec[2],vec[4])
。您没有说您希望在第二位发生什么;这个解决方案将它换到第四位。@MattMcNabb:这不应该是
vec[1]
vec[3]
?;-)。无论如何,这个问题甚至没有明确说明
vec[1]=vec[3]
不是想要的那种“移动项目”,假设元素支持移动语义,但我认为SchighSchagh对需求的解释很可能是正确的。虽然要向右旋转,您需要使用
反向迭代器
s。。。请参阅详细信息+示例。@TonyD不是个坏主意,但我认为我的方法也会起作用,因为向右旋转1与向左旋转(N-1)相同,其中N是
之间的(绝对)距离。而且,听起来OP已经有了常规(正向)迭代器。@SchighSchagh应该更喜欢使用
std::distance
而不是减法迭代器,因为前者适用于所有类型的迭代器,而不仅仅是随机访问的迭代器。
std::distance
在内部使用标记分派,因此随机访问迭代器的复杂性为O(1)。@SchighSchagh:哦,是的-似乎所有的结果都是一样的。。。不错@vsoftco很好,但由于OP指定了
向量
,因此
std::distance
使用了
运算符-
,因此在本例中也是如此。