簡體   English   中英

從向量創建最長的字符串<char>

[英]Create longest possible string from vector<char>

我以vector<char>接收數據,需要從中創建一個string 向量可以包含utf-16字符(即空字節),並且是固定大小。 實際數據用空字節填充到此固定大小。 因此,例如,我可以具有以下向量:

\0 a \0 b \0 c \0 d \0 \0 \0 \0

固定大小為12,向量包含utf-16字符串“ abcd”,並用4個空字符填充大小。

由此,我需要實際提取該字符串。 我已經有將utf-16轉換為string的代碼,令我感到困惑的是找到矢量中沒有填充的字符數(字節)。 在上面的示例中,數字為8。

我從做類似的事情開始:

std::string CrmxFile::StringFromBytes(std::vector<char> data, int fixedsize) {

    std::vector<char>iterator it = data.rbegin();
    while(it != data.rend() && *it == '\0') {
        it++;
    }

    return std::string(&data[0], fixedsize - (it - data.rbegin());
}

但是,在整個上下文中,向量包含大量數據,我只需要對其中的指定部分進行上述操作。 例如,向量可能包含1000個元素,我需要獲取從位置30開始且最多12個字符的字符串。 當然,我可以創建另一個向量,並在應用上述邏輯之前將所需的21個字符復制到其中,但是我認為我應該能夠直接在給定的向量上執行操作。 但是,我無法掌握要與之進行比較的迭代器。 任何幫助表示贊賞。

現在,這很尷尬: vector<char>::iterator顯然是一個隨機訪問迭代器,因此我可以減少它。 因此,我的方法現在看起來像這樣:

std::string CrmxFile::StringFromBytes(std::vector<char> data, int fixedsize) {
    std::vector<char>::iterator begin = data.begin() + start;
    std::vector<char>::iterator end = start + length - 1;
    while(it >= begin  && *it == '\0') {
        it--;
    }

    if(it >= begin) {
        int len = it - begin + 1;
        if(IsUtf8Heuristic(begin, begin + len) {
            return std::string(begin, begin + len);
        }
        else {  //(heuristically this is utf-16)
            len = ((len + 1) >> 1) << 1;
            std::string res;
            ConvertUtf16To8(begin, begin + len, std::back_inserter(res));
            return res;
        }
    }
    else {
        return "";
    }
}

據我了解的問題,您想從data提取max fixedsize的一部分,並擦除所有尾隨的零。 從評論中您需要最佳解決方案。

對我來說,如果數據將始終為數組形式,則您的代碼過於復雜。 使用索引,它們更能自我描述。

std::vector<char> data = ...;
int fixedsize = ...;
int start = ...;

int i = start + fixedsize - 1; // last character that can be in the string
while(i >= start && data[i] == 0) i--; // 'remove' the trailing zeroes
std::string result(&data[start], i - start + 1);

這是最優算法,沒有“更多最優”算法(存在一種微優化,它包含使用int而不是char (即連續4個char )進行測試)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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