为什么std::map存储的元素比预期的少?



为什么我代码中的映射只存储两个元素而不是三个?

vector<int> v1 = { 140,229,319 };
vector<int> v2 = { 82,216,326 };
map<int, int> mp;
for (int i = 0; i < v1.size(); i++)
{
if (v1[i] > v2[i])
{
mp.insert({ 1,v1[i] - v2[i] });
}
else if (v2[i] > v1[i])
{
mp.insert({ 2,v2[i] - v1[i] });
}
}
cout << mp.size() << endl;
for (auto it = mp.begin(); it != mp.end(); it++)
{
cout << it->first << " " << it->second << endl;
}

它应该理想地存储:(1,58) (1,13) (2,7)。但是它只存储(1,58) (2,7)。我检查了尺寸,显示的是2

我哪里错了?

首先,std::map是一个排序的关联容器,它只保留唯一的键。意思是,你所期望的是不可能与std::map

你可以用

  • std::multimap(键值对排序列表),
  • std::vector<std::pair<int, int>>(未排序的键值对列表)等,以便多个键不应该是一个问题。

我哪里出错了?

考虑检查

if(v1[i] > v2[i])

你有两个满足这个条件的迭代:

140, 229   // v1
82 , 216   // v2

前两个之间的差值(即v1[index] - v2[index])是58,第二个是13。在第一次迭代中,使用(1, 58)插入映射。在第二次迭代中,它应该有(1, 13),但是来自std::map::insert:

将元素插入到容器中,如果容器没有则已经包含一个具有相同键的元素.

因此没有插入。

最新更新