【问题标题】:Moving an item in a vector移动向量中的项目
【发布时间】:2015-03-04 04:43:13
【问题描述】:

将向量中的项目从第 4 个位置移动到第 2 个位置的最有效方法是什么。在这种情况下,向量可以包含 100 多个元素。移动元素的算法应该基于迭代器或索引(意思是找到第 4 个元素(源)和第 2 个元素(目标)),哪个更好。我已经根据索引尝试过(What is the most effective way to move items within a vector? 在我的情况下,获取第 4 和第 2 位置的迭代器比计算索引。

【问题讨论】:

  • 在这种情况下,向量可能不是合适的数据结构。一个链表。
  • 如果它是基元/POD的向量,您可以将移动的元素复制到临时,使用memmove,然后将元素复制到其目的地。
  • std::swap(vec[2], vec[4]); 。你没有说你想对已经处于第二位的人发生什么;此解决方案将其交换到第 4 位。
  • @MattMcNabb:不应该是vec[1]vec[3] 吗? ;-)。无论如何,假设元素支持移动语义,这个问题甚至没有明确表明vec[1] = vec[3] 不是想要的“移动项目”,但我认为 SchighSchagh 对需求的解释很可能是正确的。

标签: c++


【解决方案1】:

相信你可以使用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<T> vec = ...
vector<T>::iterator it = ...
size_t idx = it - vec.begin();

【讨论】:

  • 很好的引导,但要向右旋转,您需要使用reverse_iterators...有关详细信息+示例,请参阅here
  • @TonyD 不是一个坏主意,但我认为我的方式也可以,因为向右旋转 1 与向左旋转 (N-1) 相同,其中 N 是 @987654326 之间的(绝对)距离@ 和 to。此外,听起来 OP 已经有了常规(前向)迭代器。
  • @SchighSchagh 应该更喜欢使用 std::distance 而不是减去迭代器,因为前者适用于所有类型的迭代器,而不仅仅是随机访问的迭代器。 std::distance 在内部使用标签调度,因此随机访问迭代器的复杂度为 O(1)。
  • @SchighSchagh:哦,是的 - 似乎一切都一样......不错!
  • @vsoftco 好点,但是既然 OP 指定了vector,那么std::distance 无论如何都使用operator-,所以在这种情况下是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 2022-12-11
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多