【问题标题】:Using swap vs changing pointers to vectors使用交换与更改指向向量的指针
【发布时间】:2013-05-11 08:01:15
【问题描述】:

我有 2 个整数向量。有时,我想交换两者(原因如下)。我正在考虑的两个选项是使用交换函数或交换指针。我看到交换以恒定的时间运行,并且似乎是更清洁的方法。

有关交换的更多详细信息:我有多个线程访问第一个向量。有时我想对向量进行一些长时间运行的计算。我仍然想从其他线程收集数据,所以我会换一个不同的线程,以便其他线程可以在这段时间内继续运行

【问题讨论】:

  • 只要意识到vector 是一个复杂的对象,即使是原子交换(swap 函数不是原子的)也不足以同步以使其可供多个线程使用。跨度>
  • 我打算使用锁来保护它免受同步问题的影响。看起来swap是在恒定时间内运行的,想知道它是否足够好用

标签: c++ pointers vector swap


【解决方案1】:

你应该在算法库中使用 std::swap 女巫。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
    vector<int> a;
    a.push_back(10);
    vector<int> b;
    b.push_back(9);
    std::swap(a,b);
    std::cout<< a[0];
    return 0;
}

所以你看到它交换了 a 和 b

【讨论】:

  • 这和普通的vector::swap方法有什么区别?它们都在恒定时间内运行吗?
【解决方案2】:

“我有 2 个整数向量。”

为什么?看起来您想要的是多个线程可以访问的单个向量(通过适当的同步)。

任何“长时间运行的函数”都应该只对第一个向量的副本进行操作。 制作副本的代码(只是vec2 = vec1;)也应该同步。

swap 可能不是您想要的,因为在交换之后,访问向量的线程会发现向量中的旧值已经消失,他们看到的只是“第二个”向量中的值。除非第二个向量与第一个向量相同,否则它们是不一样的,这意味着它是一个副本,这意味着您只是将一个向量与其自身交换...

【讨论】:

  • 这些是快照。我知道交换向量很好,因为所有元素都会在很短的时间内被新数据替换
猜你喜欢
  • 2011-08-04
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
相关资源
最近更新 更多