C++ C++;尝试交换向量中的值

C++ C++;尝试交换向量中的值,c++,vector,swap,C++,Vector,Swap,这是我的交换功能: template <typename t> void swap (t& x, t& y) { t temp = x; x = y; y = temp; return; } 在中有一个,我想你要找的是你也可以在中找到的 您只需传递两个迭代器,每个迭代器指向要交换的元素之一。 由于您拥有这两个元素的位置,因此可以执行以下操作: // assuming your vector is called v iter_swap(

这是我的交换功能:

template <typename t>
void swap (t& x, t& y)
{
    t temp = x;
    x = y;
    y = temp;
    return;
}

中有一个,我想你要找的是你也可以在
中找到的 您只需传递两个迭代器,每个迭代器指向要交换的元素之一。
由于您拥有这两个元素的位置,因此可以执行以下操作:

// assuming your vector is called v
iter_swap(v.begin() + position, v.begin() + next_position);
// position, next_position are the indices of the elements you want to swap

提出的两种可能性(
std::swap
std::iter_swap
)都有效,只是语法略有不同。 让我们交换向量的第一个和第二个元素,
v[0]
v[1]

我们可以根据对象内容进行交换:

std::swap(v[0],v[1]);
或基于基础迭代器进行交换:

std::iter_swap(v.begin(),v.begin()+1);
试试看:

int main() {
  int arr[] = {1,2,3,4,5,6,7,8,9};
  std::vector<int> * v = new std::vector<int>(arr, arr + sizeof(arr) / sizeof(arr[0]));
  // put one of the above swap lines here
  // ..
  for (std::vector<int>::iterator i=v->begin(); i!=v->end(); i++)
    std::cout << *i << " ";
  std::cout << std::endl;
}

通过参考传递向量后

swap(vector[position],vector[otherPosition]);

将产生预期的结果。

您的代码中是否有使用命名空间std的
?因为您可能有名称冲突。顺便说一句,您不需要返回
return函数末尾的语句我的最佳猜测是,您正在实现一个二次排序算法,并且出现了一个off by one错误,因此尝试访问超出边界的向量。查看实际的错误消息将非常有帮助。这是编译时错误还是运行时错误?为什么不直接使用
std::swap
?我有同样的问题,有很多答案建议使用std::swap(就像这里投票最高的一个),但是std::swap(直接)不适用于交换向量的两个元素的内容。你的答案是std::iter_swap可以。@latreides你能澄清一下你所说的“std::swap不能(直接)交换向量的两个元素的内容”是什么意思吗?@ChrisCulter自从我发表这一评论以来已经有一段时间了(两年多一点),我能记得的只是std::swap没有给我想要(或期望)的行为但是STD::ItIdSwitter损坏了。注意,STD::ItIsFuffice(IT1,IT2)相当于STD::*It::SWAP-():对于迭代器不起作用,考虑使用STD::ItIdIsSWAPE(),而不是在这个页面上的另一个答案中建议。@ MAR由SuffFrice建议:注意STD::ItIdSwitter(IT1,IT2)相当于STD::SWAP(*IT1,*IT2)。所以std::swap可以很好地工作。
2 1 3 4 5 6 7 8 9
swap(vector[position],vector[otherPosition]);