簡體   English   中英

std :: unordered_map :: insert與std :: unordered_map :: operator []

[英]std::unordered_map::insert vs std::unordered_map::operator[]

我有一個類型為unordered_map的容器,我想確認如果要將元素添加到地圖中應該使用哪個版本。 我希望它使用新呈現的舊值覆蓋舊的值(如果存在),如果不存在則僅添加它。

我看到insert會在元素退出時添加元素,並且還會返回一對迭代器和bool,其中bool表示插入是否成功。 我還看到operator []如果不存在則添加元素,如果存在則覆蓋它。

我的問題基本上是我是否應該為此目的使用operator []或是否有未考慮的問題。 另外,如果我對這些方法的看法不正確,請糾正我。

這就是我要做的。 數據是存儲類型為int的作用域枚舉

void insertData(const Data _Data, const int _value)
{
 int SC_val = static_cast<int>(_Data);
 //sc val is now the integer value of the Data being added

 //returns a pair of iterator and bool indicating whether the insert was successful
auto ret = baseData.insert(std::pair<int,int>(SC_val,_value));

 if (ret.second == false)
 {//if the insert was not successful(key already exists)
     baseData[ret.first->first] = _value;
 }
}

還是我應該做

int index = static_cast<int>(_Data);

baseData[index] = _value;

我傾向於使用operator []版本,因為我看不出真正的區別,而且代碼少得多。 請提前告知並感謝大家。

insertoperator[]都是非常有用的方法。 它們看起來很相似,但是細節使它們大不相同。

運算符[]

返回對要搜索的元素的引用。 當不存在任何元素時,它將創建一個新的默認元素。 (因此需要默認構造函數)

用於插入元素時: myMap[key] = value; ,則該值將覆蓋鍵的舊值。

插入

返回一個迭代器和一個布爾值。 迭代器指向元素。 布爾值指示是否插入了新元素(true),或者已經包含鍵的元素(false)。

使用insert不需要默認的構造函數。

用於插入新元素時: myMap.insert({key, value}); ,如果鍵已存在於地圖中,則舊值不會更新。

insert_or_assign

Tnx感謝Marc Glisse在評論中提到它。

此方法類似於insert 區別在於元素已經存在時的行為,在這種情況下它將覆蓋現有元素。

返回一個迭代器和一個布爾值。 迭代器指向元素。 布爾值指示是否插入了新元素(true),或者已經包含鍵的元素(false)。

使用insert_or_assign不需要默認的構造函數。

用於插入新元素時: myMap.insert({key, value}); ,如果鍵已存在於地圖中,則舊值將更新。

建立地圖

您的用例將數據插入到映射中,並假定該鍵不存在。 編寫baseData[index] = _value; 會完全按照您的意願做。

但是,如果我不得不編寫它,我會使用insert變體:

auto successfulInsert = baseData.emplace(SC_val, _value).second;
assert(successfulInsert && "Value has been inserted several times.");

僅使用operator []完全適合您的情況。

僅供參考:來自cppreference.com std :: unordered_map的報價:

std::unordered_map::operator[]
Returns a reference to the value that is mapped to a key equivalent to key, performing an insertion if such key does not already exist.

我看不出真正的區別,而且代碼少得多。

你是對的!

似乎您只想在baseData中不存在數據時才插入數據。 您可以使用count()來檢查數據是否在地圖中,如下所示:

int index = static_cast<int>(_Data);
if(!baseData.count(index))
{
  baseData[index] = _value
}

暫無
暫無

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

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