【问题标题】:C++ trying to swap values in a vectorC ++试图交换向量中的值
【发布时间】:2011-09-07 15:57:21
【问题描述】:

这是我的交换功能:

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

这是我的函数(在附注 v 存储字符串)调用交换值,但每当我尝试使用向量中的值调用时,我都会收到错误。我不确定我做错了什么。

swap(v[position], v[nextposition]); //creates errors

【问题讨论】:

  • 你的代码中有using namespace std吗?因为您可能会遇到名称冲突。
  • 顺便说一句,您不需要函数末尾的 return; 语句
  • 我最好的猜测是你正在实现一个二次排序算法,并且你有一个错误,因此试图访问超出范围的向量。查看实际的错误消息真的很有帮助。是编译时错误还是运行时错误?
  • 你为什么不直接使用std::swap

标签: c++ vector swap


【解决方案1】:

我认为您正在寻找的是iter_swap,您也可以在&lt;algorithm&gt; 中找到它。
您需要做的只是传递两个迭代器,每个迭代器都指向您要交换的元素之一。
因为你有两个元素的位置,你可以这样做:

// 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::swap 不能(直接)用于交换内容向量的两个元素。你的答案,与 std::iter_swap 一样。
  • @latreides 您能否澄清一下“std::swap 不能(直接)用于交换向量的两个元素的内容”是什么意思?
  • @ChrisCulter 自从我发表评论以来已经有一段时间了(两年多一点),我能记得的是 std::swap 没有给我我想要(或预期)的行为,而是 std ::iter_swap 做到了。
  • 注意 std::iter_swap(it1, it2) 等价于 std::swap(*it1, *it2)。
【解决方案2】:

两种提议的可能性(std::swapstd::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;
}

两次交换前两个元素:

2 1 3 4 5 6 7 8 9

【讨论】:

  • std::swap() 不适用于迭代器,请考虑使用 std::iter_swap() 代替,正如本页另一个答案中所建议的那样。
  • @Mar 正如 Superfly 所建议的那样:注意 std::iter_swap(it1, it2) 等价于 std::swap(*it1, *it2)。所以 std::swap 可以正常工作。
【解决方案3】:

&lt;algorithm&gt;中有一个std::swap

【讨论】:

  • ...交换两个独立向量的内容!
【解决方案4】:

通过引用传递向量后

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

会产生预期的结果。

【讨论】:

    【解决方案5】:
    1. 通过包含&lt;algorithm&gt; 库来使用std::swap 通过引用/智能指针交换值,
      例如std::swap(v[0], v[1])
      注意:v[i] 是参考

    2. 使用来自同一个库的std::iter_swap
      例如std::iter_swap(v.begin(), v.begin() + v.size() - 1)

    3. 通过包含 &lt;tuple&gt; 库来使用左值引用和右值元组
      例如std::tie(v[0], v[1]) = std::make_tuple(v[1], v[0])
      注意: constexpr 自 C++14 起

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多