首页 > 解决方案 > 优化将 std::uint32_t 插入 std::vector

问题描述

我正在尝试将一个无符号整数数组插入到 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;
    }
}

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

两个问题:

*edit 修复了转移到此处时生成的代码中的错误。

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

标签: c++

解决方案


有没有更惯用的方式来做到这一点?

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

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));

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


推荐阅读