优化将std :: uint32_t插入std :: vector <char>

时间:2019-06-19 12:28:59

标签: c++

我正在尝试将无符号整数数组插入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个字符,这就是为什么为什么im使用buffer和sprintf为一个uint生成多个字符。

2 个答案:

答案 0 :(得分:4)

  

是否有更惯用的方法?

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

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

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

答案 1 :(得分:2)

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

首先,整数中的位数受到限制,因此不需要使用像setupKeyboard()这样的动态对象,简单的char数组就可以。由于您使用的是std::string和十进制数字,所以10个字符就足够了,如果包含nul终止符,则为11个字符。

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