优化将标准::uint32_t插入到标准::向量<char>中

Optimize inserting std::uint32_t's into a std::vector<char>

本文关键字:标准 lt gt 向量 char 插入 uint32 优化      更新时间:2023-10-16

>我正在尝试将一个无符号整数数组插入到std::vector中。

这是我当前的代码:

auto add_chars(std::vector<char> & vec, unsigned val[]){
    std::string tmp;
    tmp.resize(11) // Max chars a uint can be represented by, including the 'n' for sprintf
    for (auto x = 0; x< 10; x++){
        auto char_count = sprintf(tmp.data(),"%u", val[x]);
        vec.insert(vec.begin()+vec.size(),tmp.data(), tmp.data()+char_count);
    }
}
int main(){
    std::vector<char> chars;
    unsigned val[10] {1,200,3,4,5,6000,7,8,9000};
    add_chars(chars,val);
    for (auto & item : chars){
        std::cout << item;
    }
}

这个解决方案有效,但我质疑它的效率(和优雅(。

两个问题:

  • 有没有更惯用的方法呢?
  • 有没有更有效的方法呢?

*编辑 修复了转移到此处时代码中的错误。

另外,我知道"9000"不能表示为 1 个字符,为什么我使用缓冲区和 sprintf 为一个 uint 生成多个字符。

有没有更惯用的方法呢?

字符流对此是惯用的。不幸的是,该标准只有一个用于构建字符串的流;不是向量。不过,您可以将字符串复制到向量中。这不是最有效的方法:

std::ostringstream ss;
unsigned val[10] {1,200,3,4,5,6000,7,8,9000};
for (auto v : val)
    ss << v;
std::string str = ss.str();
// if you need a vector for some reason
std::vector<char> chars(std::begin(str), std::end(str));

或者你可以编写自己的自定义矢量流,但这将是很多样板。

我会做一些更改(并修复错误(。

首先,整数中的位数是有限的,因此无需使用像std::string这样的动态对象,一个简单的字符数组就可以了。由于您使用的是uint32_t和十进制数字,因此 10 个字符就足够了,如果包含 NUL 终止符,则为 11 个字符。

其次,sprintf和类似功能效率低下,因为它们必须解释格式字符串,"%u"在您的情况下。执行从uint32_t到数字的转换的手写功能会更有效。