优化将标准::uint32_t插入到标准::向量<char>中
Optimize inserting std::uint32_t's into a std::vector<char>
>我正在尝试将一个无符号整数数组插入到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
到数字的转换的手写功能会更有效。
相关文章:
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 呼叫运营商<<临时
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 标准库类型的赋值运算符的引用限定符
- 标准是否严格定义了该程序应该如何编译?
- 如何从Windows应用程序输出到标准?
- 安全到标准:移动会员?
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 这是否符合C++标准:双响双响,例如!!(-0.0).
- C++标准::cout和<<操作员,优先级