将 const 无符号字符* 分配给执行就地替换或省略的 std::string

Assigning const unsigned char* to a std::string performing in-place substitution or omission

本文关键字:替换 string std 字符 无符号 const 分配 执行      更新时间:2023-10-16

我有一个以空结尾的字符缓冲区const unsigned char* bar

我需要将其复制到std::string.目前我使用

std::string foo;
foo.assign(bar);

但由于各种原因(由于bar),值> 127 的奇数字符出现在列表中。用 32(空格)替换这些字符就足够了,最好完全省略它们。

有没有办法进行更换

  1. 在我复制到字符串之后。使用类似 std::replace(foo.begin(), foo.end(), /*something funky*/

  2. 当我做assign时,使用某种谓词的"后插入器"。

我更喜欢 (2) 行的内容。在我深入研究for循环之前,有没有一种更像 stl 的方法可以做到这一点?

如果您只想省略值>= 128(如果字符有符号,则< 0),这样的事情应该可以解决问题:

std::copy_if(bar, bar + <length of string>,
    std::back_inserter(foo),
    [](char c) { return c < 128 && c >= 0;});

我更喜欢 (2) 行的内容。在我深入研究 for 循环之前,有没有一种更像 stl 的方法可以做到这一点?

考虑 std::transform 并将两个流(原始流和字符串流)视为迭代器序列:

const unsigned char* bar = some_data();
auto length = std::strlen(reinterpret_cast<const char*>(bar));
const auto bar_end = bar + length;
std::string foo{ length, ' ' }; // avoid reallocations in transform
std::transform(bar, bar_end, foo.begin(), [](const unsigned char c) -> const char {
    return c > 127 ? ' ' : reinterpret_cast<const char>(c);
});