6

データの格納に配列を使用していましたが、ベクトルに置き換えたので、すべての c 演算子を c++ 演算子に置き換えたいと考えています。memcpy を使用して 1 つのメモリ ブロックをコピーしました

for (i = 0; i < rows_; i++)
    memcpy((T *) &tmp.data_[cols_ * i], (T *) &a.data_[cols_ * (2 * i + 1)], rows_ * sizeof(T));

ベクトルでも動作します。C ++に同等の関数があることを知りたいだけですか?

私はコピーを試しました:

std::copy(tmp.data_[cols_ * i], tmp.data_[cols_ * i+rows], a.data_[cols_ * (2 * i + 1)]);

しかし、次のエラーが表示されます。

error: invalid use of member function (did you forget the ‘()’ ?)

例えば:

2xnxn サイズの配列があり、代わりに for サイクルを使用して nxn 配列を作成しています。たとえば、1 2 3 4 5 6 7 8 がある場合、新しい配列は次のようにする必要があります: 3 4 7 8. memcpy を使用してこれを達成しましたが、C++ でどのように達成できるかわかりません

4

3 に答える 3

4

標準アルゴリズムのコピーがあります。POD 以外の型でも動作するため、memcpy よりも安全です。memcpy になるように POD タイプ用に最適化されることがあります。通常、標準アルゴリズムではポインターを使用しませんが、反復子を使用する必要があります。使用するイテレータbegin()end()メソッドまたはフリー関数を取得するには。例:

vector<int> a(10, 5);
vector<int> b(5);

copy(a.begin(), a.begin()+5, b.begin());
于 2012-11-26T07:34:01.247 に答える
3

from からto にコピーする場合はstd::copyorを使用しますstd::vector::assignarrayvector

  int from_array[10] = {1,2,3,4,5,6,7,8,9,10};

  std::vector<int> to_vector;

  int array_len = sizeof(from_array)/sizeof(int);
  to_vector.reserve(array_len);
  std::copy( from_array, from_array+10, std::back_inserter(to_vector)); 
  or C++11
  std::copy( std::begin(from_array), std::end(from_array), std::back_inserter(to_vector));   

  std::vector<int> to_vector2;
  to_vector2.reserve(array_len);
  to_vector2.assign(from_array, from_array + array_len);

ベクトルからベクトルにコピーする場合

   std::vector<int> v1;
   std::vector<int> v2;
   v2 = v1; // assign operator = should work

v1を保持する必要がない場合std::swapも機能します

v2.swap(v1);

アップデート:

  const int M = 2;
  const int N = 4;
  int from_array[M][N] = {{1,2,3,4},{5,6,7,8}};

  std::vector<int> to_vector;
  to_vector.reserve(N);
  int start=2;
  int end = 4;
  for (int i=0; i<M; i++)
  {
    std::copy( from_array[i]+start, from_array[i]+end, std::back_inserter(to_vector)); 
  }
于 2012-11-26T07:54:48.497 に答える
3

さて、1 つのベクター コンテンツを別のベクター コンテンツにコピーするために使用できるstd::vectorネイティブがあります。operator=()

std::vector<T> x;
std::vector<T> y;
y = x;

std::copyイテレータで動作し、配列スライスをコピーできるものもあります。

于 2012-11-26T07:35:24.723 に答える