簡體   English   中英

將std :: strings插入到std :: map中

[英]inserting std::strings in to a std::map

我有一個程序,可以逐行讀取文件中的數據。 我想將該行的一些子字符串復制到地圖中,如下所示:

std::map< DWORD, std::string > my_map;
DWORD index;         // populated with some data
char buffer[ 1024 ]; // populated with some data
char* element_begin; // points to some location in buffer
char* element_end;   // points to some location in buffer > element_begin

my_map.insert( std::make_pair( index, std::string( element_begin, element_end ) ) );

這個std::map<>::insert()操作需要很長時間(它將文件解析時間加倍)。 有沒有辦法讓這個更便宜的操作?

謝謝,PaulH

編輯:更具體地說,我想知道我正在進行最少數量的復制操作,以便將文件中的數據傳入地圖。

你真的需要一張地圖嗎? 就我在你的例子中看到的那樣,你只想將索引存儲為鍵值,正如我想的那樣,只是為每次插入增加了一個值。 你可以使用std::vector來完成這個任務,它被認為是最快的容器。 只需使用push_back並使用at(index)訪問該值。

你可以嘗試一些事情。 數據結構和字符串本身的創建都涉及到開銷。

  1. 它需要是一張map嗎? 您可以嘗試使用std::tr1::unordered_map ,看看是否有幫助。

  2. 查找需要多快? 如果你可以使用O(n)查找時間,你可以嘗試std::vector

  3. 您是否需要存儲每個子字符串的副本? 你可以只存儲一個指針嗎?

也許你可以嘗試另一個版本的字符串構造函數:

string ( const char * s, size_t n );

如果你的字符串實現沒有char * ,它將被強制遍歷給定的范圍並單獨復制每個字符。 在這種情況下,上面的構造函數可能更快(雖然只是猜測)。

稍微回答你的補充質詢。 嘗試暫時將地圖更改為字符串向量,然后將固定字符串值插入向量時計時例如:

vector <string> v;
string s( "foobar" );

your insert loop:
   v.push_back( s );

這應該給你一個關於速度的可能性的下限。

此外,您應該開啟所有優化的時間(如果您還沒有這樣做)。 這可能會給許多標准庫操作帶來驚人的差異。

你正在存儲字符串,但我猜你已經讀過它們並將它們添加到地圖中。 這將導致副本。 如果將指針存儲在其中的字符串(字符串*而不是字符串)可能會更快。

如果編譯器無法優化插入中的冗余副本,則可以使用括號運算符直接分配到地圖中:

my_map[index].assign(element_begin, element_end)

編輯:正如尼爾指出,如果可以插入重復的密鑰,這將沒有用。

鑒於您需要將數據放入std::map<DWORD, std::string>然后,是的,您正在執行最少數量的復制操作以將數據放入映射中。

我相信你使用地圖的大部分執行時間都是復制字符串。 std::map喜歡擁有自己的所有副本。 因此,當您插入時, std::map會生成密鑰和值的副本。

很久以前,當處理器速度慢且內存很小時,程序員會使用指向“大”數據項的指針並傳遞指針而不是每次都復制數據。 指針是一個比字符串小得多的實體,需要較少的執行時間來復制。 也許你應該在地圖中存儲指向字符串的指針:

#include <map>
#include <string>
#include "boost/shared_ptr.hpp"

typedef boost::shared_ptr<string>    Shared_Str_Ptr;

typedef std::map< DWORD, Shared_Str_Ptr> Map_Container;

//...
Map_Container my_map;
Shared_Str_Ptr p_str(new std::string("Hello"));
my_map[5] = p_str;

shared_ptr將為您處理內存管理,因此在刪除地圖或其內容時無需擔心。

另請參閱Boost Smart Pointers

暫無
暫無

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

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