我有以下代码将 a 复制std::vector a
到 another 中std::vector b
,但以 2 作为起始索引。由于两个向量的长度都是 4,这会导致越界写入。我想让这段代码抛出异常,但我该怎么做呢?下面的代码因分段错误而崩溃。
#include <vector>
#include <iostream>
int main()
{
std::vector<double> a = {1, 2, 3, 4};
std::vector<double> b(4);
try
{
std::transform(a.begin(), a.begin()+4, b.begin()+2,
[](const double d) { return d; });
}
catch (std::exception& e)
{
std::cout << "EXCEPTION: " << e.what() << std::endl;
return 1;
}
return 0;
}
std::transform
假设 [d_first, d_first+std::distance(first1, last1))
是有效的。
但是您可以编写自己的算法,如果您还向输出范围添加“结束”迭代器:
template <typename InputIt, typename OutputIt, typename UnaryOp>
OutputIt safe_transform(
InputIt first1, InputIt last1,
OutputIt first2, OutputIt last2,
UnaryOp unary_op )
{
while ( first1 != last1 ) {
if ( first2 == last2 )
throw std::domain_error( "Reached end of output range" );
*first2 = unary_op( *first1 );
++first1;
++first2;
}
return first2;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句