[英]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;
}
}
該解決方案有效,但是我質疑其效率(和優雅度)。
兩個問題:
* edit修復了轉移到此處時產生的代碼中的錯誤。
另外,我知道'9000'不能表示為1個字符,這就是為什么為什么im使用buffer和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
這樣的動態對象,簡單的char數組就可以。 由於您使用的是uint32_t
和十進制數字,所以10個字符就足夠了,如果包含nul終止符,則為11個字符。
其次, sprintf
和類似的代碼效率很低,因為它們必須解釋格式字符串"%u"
。 手寫函數執行從uint32_t
到數字的轉換會更有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.