首页 > 文章列表 > C++程序用于通过键更新字典的值

C++程序用于通过键更新字典的值

C程序 键更新 字典值更新
177 2023-08-29

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

我们首先看一下地图数据结构的定义。这些内部模板需要两种不同的类型。下面显示了语法和必要的库 -

定义地图数据结构的语法

#include 
map mapVariable;

在这种情况下,我们必须导入“地图”库才能使用地图数据结构。为此需要数据类型 1 和 2。 key参数的数据类型为type1,value参数的数据类型为type2。这里从地图类型类派生的对象是mapVariable。现在让我们看看如何使用 C++ 映射来获取它。

在映射数据结构中,我们可以通过访问现有键或新键将值放入映射中。由于这里我们讨论的是更新值,因此我们必须更新现有的密钥。键将像数组索引符号一样用在方括号内。让我们看看这个的语法 -

更新地图内元素的语法

mapVariable [] = ;

算法

  • 已创建的字典或地图 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

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

搜索后更新

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

算法

  • 已创建的字典或地图 D

  • 已有键值k

  • 新密钥 k 的值 v

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

  • 调用 find() 方法将字典 D 放入 itr

  • 如果 itr 不是 D 的末尾,则表示密钥存在,则

    • 将 v 放入 itr

  • 结束如果

示例

#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函数将映射、现有键和 newValue 作为输入。之后搜索该密钥。如果存在,则仅更新该值,否则只需从该函数中得出。因此,通过使用此方法,我们无法在地图中创建新条目,而只能更新现有条目。

结论

在这篇文章中,我们了解了如何使用键更新地图中的元素。在第一种方法中,我们使用直接分配方法,该方法成功更新元素,但当键尚不存在时,它也可以添加新元素。第二种方法通过一开始的简单搜索消除了这个问题。有时我们可能会注意到第二种方法需要额外的时间来搜索密钥然后更新它。因此,与第一种方法相比,它需要更多的搜索时间。但如果我们仔细思考,在第一种方法中,这一发现也本质上得到了实现。由于数据结构使用基于哈希的技术,因此它将在恒定时间内运行(在大多数情况下)。