簡體   English   中英

優化將std :: uint32_t插入std :: vector <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;
    }
}

該解決方案有效,但是我質疑其效率(和優雅度)。

兩個問題:

  • 有沒有更慣用的方法呢?
  • 有更有效的方法嗎?

* 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM