我正在尝试将无符号整数数组插入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生成多个字符。
答案 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"
到数字的转换会更有效。