使用键更新字典值的C++程序


许多计算机语言都提供字典,这是一种数据结构。字典是一种更快的数据结构,它基于键和值存储数据。它保留键值对,以便键可以几乎实时地轻松搜索特定组件。C++ STL语言标准包含类似字典的数据结构。“map”一词用于描述这种数据结构。map创建任意类型的键值对(由于我们使用的是C++,因此必须在编译前定义类型)。本节将演示如何在C++中更新已存在的map或字典中的值。

让我们首先检查map数据结构的定义。这些内部模板需要两种不同的类型。以下是语法和必要的库:

map数据结构的定义语法

#include 
map mapVariable;

在这种情况下,我们必须导入“map”库才能使用map数据结构。这需要数据类型1和2。键参数的数据类型是type1,值参数的数据类型是type2。此处从map类型类派生的对象是mapVariable。现在让我们看看如何使用C++ map来实现这一点。

在map数据结构中,我们可以通过访问现有键或新键将值放入map中。由于这里我们讨论的是更新值,因此我们必须更新现有键。键将像数组索引表示法一样用方括号括起来。让我们看看这方面的语法:

更新map中元素的语法

mapVariable [] = ;

算法

  • 一个已创建的字典或map D

  • 已存在的键值k

  • 新键k的值v

  • 更新为 D[ k ] = v

  • 返回 D

示例

#include <iostream> 
#include <map> 
using namespace std;

void display( map <string, int>& givenMap ){
   for ( auto& it : givenMap ) {
      cout << "Key: " << it.first << ", value: " << it.second << endl;
   }
}
   
int main(){ 
   map<string, int> givenMap;
   
   givenMap = { { "ABCD", 25 },
        { "EFGH", 50 },
        { "IJKL", 75 },
        { "MNOP", 100 },
        { "QRST", 125 }
   };
   
   cout << "Before updation: " << endl;
   display( givenMap );
  
   cout << "After Updation: " << endl;
   
   //update the value of MNOP to 500
   givenMap[ "MNOP" ] = 500; 
   display( givenMap );
}

输出

Before updation: 
Key: ABCD, value: 25
Key: EFGH, value: 50
Key: IJKL, value: 75
Key: MNOP, value: 100
Key: QRST, value: 125
After Updation: 
Key: ABCD, value: 25
Key: EFGH, value: 50
Key: IJKL, value: 75
Key: MNOP, value: 500
Key: QRST, value: 125

在这种方法中,我们已成功通过访问键参数更新了值。但是,此过程并非一直准确。此过程有一个严重的缺点,即给定的键可能不存在于map中。但是,使用此过程将插入一个具有给定值的新键。因此,在下一种方法中,我们将看到如何在成功搜索后搜索和更新元素。

搜索后更新

可以使用map对象中的find()函数检查map中是否存在键。它将返回键的指针引用,否则将返回map的“end()”指针,这表示map中不包含该元素。让我们看看算法和实现以更好地理解。

算法

  • 一个已创建的字典或map D

  • 已存在的键值k

  • 新键k的值v

  • 创建一个迭代器对象itr以获取键值对的指针

  • 调用字典D的find()方法到itr中

  • 如果itr不是D的末尾,则表示键存在,然后

    • 将v放入itr

  • 结束if

示例

#include <iostream> 
#include <map> 
using namespace std;

void display( map <string, int>& givenMap ){
   for ( auto& it : givenMap ) {
      cout << "Key: " << it.first << ", value: " << it.second << endl;
   }
}

void updateElement( map <string, int>& givenMap, string givenKey, int newValue ){
   map <string, int>::iterator itr;
   itr = givenMap.find( givenKey );
   if( itr != givenMap.end() ){   // when item has found
      itr->second = newValue;
   }
}
   
int main(){ 
   map<string, int> givenMap;
   
   givenMap = { { "ABCD", 25 },
        { "EFGH", 50 },
        { "IJKL", 75 },
        { "MNOP", 100 },
        { "QRST", 125 }
   };
   
   cout << "Before updation: " << endl;
   display( givenMap );
  
   cout << "After Updation: " << endl;
   
   //update the value of MNOP to 500
   updateElement( givenMap, "MNOP", 1580 );
   display( givenMap );
}

输出

Before updation: 
Key: ABCD, value: 25
Key: EFGH, value: 50
Key: IJKL, value: 75
Key: MNOP, value: 100
Key: QRST, value: 125
After Updation: 
Key: ABCD, value: 25
Key: EFGH, value: 50
Key: IJKL, value: 75
Key: MNOP, value: 1580
Key: QRST, value: 125

在这种方法中,updateElement函数将map、现有键和newValue作为输入。之后搜索该键。如果存在,则只更新值,否则直接退出函数。因此,使用此方法,我们无法在map中创建新条目,而只能更新现有条目。

结论

在这篇文章中,我们了解了如何使用键更新map中的元素。在第一种方法中,我们使用直接赋值方法成功更新了元素,但当键不存在时,它也可以添加新元素。第二种方法通过在开始时进行简单的搜索来消除这个问题。有时我们可能会注意到,第二种方法需要额外的时间来搜索键然后更新它。因此,它比第一种方法需要额外的搜索时间。但是,如果我们仔细考虑,第一种方法中也隐含地进行了查找。由于使用的结构使用了基于散列的技术,因此它将在恒定时间内运行(在大多数情况下)。

更新于:2022年12月13日

3K+ 次浏览

开启你的职业生涯

通过完成课程获得认证

开始学习
广告