【问题标题】:c++ convert vector<pair<double,double>> to double*, double*?c ++将vector<pair<double,double>>转换为double*,double*?
【发布时间】:2017-02-17 11:14:47
【问题描述】:

有没有办法获得vector&lt;pair&lt;double,double&gt;&gt;的“.first”和“.second”的连续内存?我的意思是:

void func(int N, double* x, double* y)
{
    for (int i = 0; i < N; ++i)
        //do something to x[i] and y[i]
}

对于上述函数,我有一个vector&lt;pair&lt;double,double&gt;&gt; point 而不是vector&lt;double&gt; x, y。我猜这是不可能的。如果我有一个向量 x,y 那么我当然可以做 x.data() 和 y.data()。

【问题讨论】:

  • 你不能改变函数来处理向量吗?如果不是,您必须遍历数组并填充一个新向量。或者,您可以为 vector&lt;pair&lt;double,double&gt;&gt; 编写自己的迭代器,分别在第一个/第二个迭代。
  • 你的意思是这样的吗:&amp;vec[0] 来获取指向元素 0 的指针。但如果向量内部有一对,则仍然需要使用 vec[0].firstvec[0].second
  • 顺便说一句,这些对在连续的内存中,但 x(和 y)不是
  • 是的,我认为这是一个概念问题。也许不可能在vector&lt;pair&lt;double,double&gt;&gt; 中拥有所有x 值和所有y 值的连续内存,同时还保持vector&lt;double&gt; 的连续内存。它们必须是物理上/概念上相反的想法。我们需要一个自定义容器或迭代器之类的东西。
  • 请回答问题:你能改变功能吗?还有,为什么你有vector&lt;pair&lt;double,double&gt;&gt; 你能改变这个吗?

标签: c++ vector type-conversion


【解决方案1】:

std::vector&lt;std::pair&lt;double, double&gt;&gt; xystd::vector&lt;double&gt; x,y 的内存布局不同。如果func 是第三方库的一部分,您无法更改,您一定要

a) 使用N=1 或(快速脏话)致电func 几次

auto xy = std::vector<std::pair<double, double>> {
  {0,0}, {42,0}, {0, 42}, {42, 42}
};
for (auto& [x,y] : xy) { // or for (auto& p : xy) func(1, p.first, p.second)
  func(1, &x, &y);
}

b) 将xy 转换为xy

template <typename T, typename S>
auto convert(const std::vector<std::pair<T,S>>& xy)
{
  auto xs = std::vector<T>{};
  auto ys = std::vector<S>{};
  xs.reserve(xy.size());
  ys.reserve(xy.size());
  for (auto& [x,y] : xy) {
    xs.push_back(x);
    ys.push_back(y);
  }
  return std::make_pair(xs, ys);
}

int main()
{
  auto xy = std::vector<std::pair<double, double>> {
    {0,0}, {42,0}, {0, 42}, {42, 42}
  };
  auto [x, y] = convert(xy);
  func(xy.size(), x.data(), y.data());
}

c) 只需将xy 的定义更改为xy

如果您可以更改func,我建议您进行重构,以便您可以调用内部循环并将其重写为迭代器(或范围)。这样你就可以将它与std::pairs 上的投影一起使用。

Here is the full source code.

【讨论】:

  • aha,有趣的是,A 不起作用,因为这个特定的函数需要对多个索引求和来改变 y 的值(一个 la 卷积)。所以看起来唯一的选择是使用separate x and y 而不是pair of x and y 或更改功能。
  • 我添加了将向量转换为单独向量的源代码。如果向量很大,则必须小心。我不确定通过std::make_pair 调用的额外分配和副本。
猜你喜欢
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多