2014-04-30 77 views
1

我一直工作在其20%截斷,一旦達到設定的作爲大小限制(例如10MB),一個基本的日誌文件類,我決定將文件存儲到一個字符串流緩衝器中,然後存儲它記錄由登錄到一個std ::雙端隊列(使用一個std ::雙端隊列來代替std ::矢量所以可以很容易地從該結構的頂部彈出,而不必進行排序等)的加載和存儲是如下圖所示:的std ::在內存雙端隊列<std::string>計數尺寸有效

std::deque<std::string> vLogs; 
    std::stringstream ssBuffer; 
    std::string sLog; 

    ssBuffer << in.rdbuf(); 
    in.close(); 

    while(getline(ssBuffer,sLog)) 
     vLogs.push_back(sLog); 

日誌文件的設計,所以當它達到設定大小(例如10MB),所以我真正想要做的是檢查多大的std :: string的是視頻博客內截斷它 - 我可以採用以下方式:

int nSize = 0; 
    for(auto it = vLogs.begin(); it != vLogs.end(); ++it) 
     nSize += it->size(); 

    do{ 
     nSize -= vLogs.front().size(); 
     vLogs.pop_front(); 
    }while(nSize > (MAX_SIZE * 0.8)); 

我問的問題是,是否有一個更有效的方式來獲取std ::字符串佔用的實際大小,而不是像現在這樣手動執行。

感謝 - 任何詳細信息,只問。

+1

做你自己的類,將有一個'的std :: deque'和**內存大小計數器**和顯示器插入(例如添加的內存插入到櫃檯大小)和提取(例如,減去的內存大小從櫃檯提取)。 – 101010

+1

您是否可以讓您的deque成爲日誌記錄類的成員,並在每次推送和彈出時更新總大小,這樣您始終可以將大小保持在最新狀態,並且如果新項目日誌大小添加到總數超過閾值那麼你彈出,直到總數低於閾值 – EdChum

+0

是的,我認爲你們都把它釘在頭上 - 我忽略了這一點,因爲我的過度簡化的方法 - 創建一個答案,我會接受。 – Mike

回答

3

做你自己的班級將有一個std::deque和一個存儲器大小計數器和監測插入(例如,添加插入計數器的內存大小)和提取(例如減去從計數器提取的內存大小)。

1

現在,您添加了大小很多很多次。這不是必需的。

您可以

  • 加起來所有的尺寸,然後調整每次下來您去除項目

  • 在反轉開始加起來大小的總從尾部,一旦你達到閾值,請從該點所有的項目都開始
+0

每次我經過while循環時,我都會刪除一個項目 - 儘管我喜歡你的第二個想法,但找到總數的20%,並從頂部移除,直到這20%被刪除。 – Mike

+0

@Mike:您是否理解「刪除項目時向下調整總量」與「刪除項目時從頭開始重新計算總量」之間的區別? –

+0

是的,對不起。我衝過這個例子 - 這正是我目前正在做的。 – Mike