c ++转换载体<pair <double,double>&gt;加倍*,加倍*?

时间:2017-02-17 11:14:47

标签: c++ vector type-conversion

有没有办法获得&#34; .first&#34;的连续记忆?和&#34; .second&#34; vector<pair<double,double>>的?我的意思是:

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

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

1 个答案:

答案 0 :(得分:2)

std::vector<std::pair<double, double>> xystd::vector<double> x,y的内存布局不同。如果func是您无法更改的第三方库的一部分,则您必须

a)使用func或(快速肮脏)

多次致电N=1
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::pair s上的投影结合使用。

Here is the full source code.