gpt4 book ai didi

c++ - 如何使用 std::transform 为越界写入抛出异常?

转载 作者:太空宇宙 更新时间:2023-11-04 15:32:54 49 4
gpt4 key购买 nike

我有以下代码将 std::vector a 复制到另一个 std::vector b 中,但起始索引为 2。由于两个 vector 的长度均为 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;
}

关于c++ - 如何使用 std::transform 为越界写入抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44737472/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com