私は(十分なスペースがあると仮定)ダブルスのstd::vector
を取る機能があり、別のベクトルにコピーしますが、特定のオフセット:これはC++ 11打ち鳴らすコンパイラになりC++:std :: vector iteratorにオフセットするための正しいキャストは何ですか?
void copy_stuff(const std::vector<double> & data,
std::vector<double> & dest,
size_t dest_offset) {
std::copy(data.begin(), data.end(), dest.begin() + dest_offset);
}
+ dest_offset
部分を中心に-Weverything
警告:
Implicit conversion changes signedness: 'size_t' (aka 'unsigned long') to 'difference_type' (aka 'long').
は、私はこの警告を解消するために、発現dest.begin() + dest_offset
をキャストする必要がありかどうかはわかりません。 double *
に結果をキャストすると、コンパイルされません:
std::copy(data, data + data_size, static_cast<double *>(dest.begin() + dest_offset));
Cannot cast from type 'std::__1::__wrap_iter' to pointer type 'double *'.
を私はベクトルのインデックスを使用して検討し、その後、アドレスを取っていました:
std::copy(data, data + data_size, &dest[dest_offset]);
これは、この場合に警告を排除するようだが、ソースベクトルで同じパターンを使用しようとすると、つまり、最初のパラメータまたは第2引数に含まれるオフセットがstd::copy
になると、コンパイルされません。たとえば、
static void copy_stuff_differently(const std::vector<double> & data,
std::vector<double> & dest,
size_t offset) {
std::copy(data.begin() + offset, data.end(), dest.begin());
}
+ offset
で暗黙の変換についての元の警告が表示されます。
std::copy(&data[offset], data.end(), dest.begin());
それとも異なるが、同様のケース:しかし
std::copy(data.begin(), &data[offset], dest.begin());
両方が同様のエラーが発生:私は
test.cpp:8:3: error: no matching function for call to 'copy'
std::copy(&data[offset], data.end(), dest.begin());
^~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iterator:1286:48: note:
candidate template ignored: deduced conflicting types for parameter '_Ip' ('const double *' vs.
'std::__1::__wrap_iter<const double *>')
template <class _Ip, class _Op> friend _Op copy(_Ip, _Ip, _Op);
^
を示唆するかもしれないアドレスのインデックスを使用しようとすると、そのようなオフセットを処理する一貫性のある、警告のない方法を探していました。ベクトルへのオフセットを処理し、そのようなエラーや警告を避ける正しい方法は何ですか?
非常に明示的に言えば、***使用しないでください - すべてを使用する必要があります。 –
'std :: next(std :: begin()、dest_offset)'は何かを変更しますか? –