gpt4 book ai didi

C++:尝试使用等效的 STL 算法消除原始循环

转载 作者:太空狗 更新时间:2023-10-29 21:10:48 24 4
gpt4 key购买 nike

我正在尝试使一些 C++ 代码现代化,遵守核心准则并发布++11 建议。我在这里提出的具体指导方针是使用 <algorithm>代替原始循环的设施,在整个序列中应用静态操作以产生新序列。

第一个示例说明了成功(正如我在本文中定义的那样)。 std::byte 的两个输入 vector 进来,一个出来,代表每个输入 vector 的成对按位异或,保持输入 vector 不变。这个问题的精神功能是std::transform.

vector<byte> XORSmash(const vector<byte>& first, const vector<byte>& second)
{
if (first.size() != second.size())
throw std::invalid_argument("XORSMASH: input vectors were not of equal length\n");

vector<byte> convolution; convolution.reserve(first.size());

transform(first.cbegin(), first.cend(), second.cbegin(), back_inserter(convolution),
[](const byte byte1, const byte byte2) {return byte1 ^ byte2;} );

return convolution;
}

但是,还有另一个功能,我在设计一个不比循环解决方案更差的非循环解决方案时遇到了麻烦。此函数接受 string。 HexChars(每个字符最终传达 4 位值),并生成一个 vector<byte> ,其中每个元素包含两个HexChars的内容,一个在高4位,一个在低4位。什么CharToHexByte函数确实不相关(如果有必要我会包括在内),只是它需要一个兼容的十六进制字符,并返回一个 std::byte , 十六进制字符的数值,即 0-15,只加载 4 位。问题是输入字符串有一对十六进制字符(每个半字节的值),每个都统一为一个十六进制字节。我不能使用 std::transform ,据我所知,由于输入迭代器每次迭代必须跳转 2 ( 2 * sizeof(char)//aka container_const_iterator += 2 in this case ),以提取输入字符串中的下一个 字符。

TLDR:是否有算法ic 方法来实现以下函数而无需公开 for循环,这不会比下面的解决方案更昂贵/冗长吗?

vector<byte> UnifyHexNibbles(const string& hexStr)
{
if (hexStr.size() % 2)
throw std::invalid_argument("UnfyHxNbl: Input String Indivisible by 8bits. Pad if applicable.\n");

vector<byte> hexBytes; hexBytes.reserve(hexStr.size() >> 1);
//can I be eliminated elegantly?
for (size_t left(0), right(1); right < hexStr.size(); left += 2, right += 2)
hexBytes.push_back( CharToHexByte(hexStr[left]) << 4 | CharToHexByte(hexStr[right]) );

return hexBytes;
}

最佳答案

range-v3 , 就是

std::vector<std::byte>
UnifyHexNibbles(const std::string& hexStr)
{
if (hexStr.size() % 2)
throw std::invalid_argument("size indivisible by 2.");


return hexStr
| ranges::view::chunk(2)
| ranges::view::transform([](const auto& r)
{
return std::byte(CharToHexByte(r[0]) << 4 | CharToHexByte(r[1]));
});
}

Demo

关于C++:尝试使用等效的 STL 算法消除原始循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52749020/

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