gpt4 book ai didi

c++ - 3d vector - 变换和减去

转载 作者:行者123 更新时间:2023-11-28 04:11:50 25 4
gpt4 key购买 nike

std::transform 可以嵌套使用吗?试图这样做:

                    {
return std::transform(asciivec(inner.front()).begin(), asciivec(inner.front()).end(), asciivec(inner.back()).begin(), asciivec(inner.back()).end(),out.begin(), std::minus<float>{});
}
);
Error: 
stl_algo.h||In instantiation of '_OIter std::transform(_IIter, _IIter, _OIter, _UnaryOperation) [with _IIter = __gnu_cxx::__normal_iterator<const std::vector<std::__cxx11::basic_string<char> >*, std::vector<std::vector<std::__cxx11::basic_string<char> > > >; _OIter = __gnu_cxx::__normal_iterator<double*, std::vector<double> >; _UnaryOperation = main()::<lambda(const auto:1&)>]':|


error: no matching function for call to 'transform(std::vector<double>::iterator, std::vector<double>::iterator, std::vector<double>::iterator, std::vector<double>::iterator, std::vector<double>::iterator, std::minus<float>)'|

最佳答案

您走在正确的轨道上,但您错过了一些事情。

  • 对于二元运算,std::transform仅对第一个输入范围采用开始和结束迭代器;它需要第二个范围的开始迭代器,并假设第二个范围至少与第一个范围一样大(这样对于范围内的任何元素 [first1, last1) ,范围内有一个匹配元素从 first2 开始)。

  • 假设asciivec()返回一个临时对象(而不是对缓存对象的引用),迭代器 asciivec(inner.front()).begin()asciivec(inner.front()).end()实际上指的是两个不同的范围;这将导致运行时错误。您需要缓存 asciivec() 的结果在 lambda 内部调用,为它们提供足够的持久性来完成操作。

  • std::minus将其操作数计算为 lhs - rhs ,因此将返回 -1对于 std::minus<float>{}('a', 'b') .由于您的示例结果是肯定的,我假设您需要绝对值,因此扩展和注释了我的代码。

因此,考虑到这一点,我们可以做一些细微的改动...

// Renamed "inner" to "in" for convenience here.
std::transform (inp.cbegin(), inp.cend(), out.begin(), [&](const auto& in)
{
// Tying element type to asciivec() for convenience.
using Container = decltype(asciivec(in.front()));
using Elem = typename Container::value_type;
//using Elem = typename decltype(asciivec(in.front()))::value_type;

// Create non-temporary vectors first, to guarantee expected results.
std::vector<Container> inner = { asciivec(in.front()), asciivec(in.back()) };

// Use either...
// static Container ret;
// ret.clear(); ret.resize(inner.front().size());
// Or...
Container ret(inner.front().size());

std::transform(inner.front().begin(), // InputIt first1
inner.front().end(), // InputIt last1
inner.back().begin(), // InputIt first2
//asciivec(inner.back()).end(), // Omit
ret.begin(), // OutputIt d_first
std::minus<float>{}); // BinaryOperation binary_op

// I'm positive you want absolute values. ;3
// Lambda provides nice, clean overload resolution, compared to a function pointer or similar.
std::transform(ret.begin(), ret.end(), ret.begin(), [=](const Elem& e) { return std::fabs(e); });

return ret;
}
);

如果实际上需要签名,我们可以注释掉第二个 transform()打电话。

查看实际效果 here .

经过编辑以增加通用性,无论您的数据的实际类型如何,直接插入应该没问题。

关于c++ - 3d vector - 变换和减去,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57594645/

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