我有一个函数,它双打的std::vector
,并将它们复制到另一个载体,但在特定的偏移量(假设有足够的空间):C++:退出到std :: vector迭代器的正确转换是什么?
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);
}
这导致C++ 11铛编译器-Weverything
警告集中在+ dest_offset
部分:
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]);
这似乎消除在这种情况下,警告,但如果我尝试使用与源矢量相同的模式,即与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)'改变什么? –