GO语言基础-04-数据类型-04-map(声明map、初始化map、map赋值、遍历map、判断key是否在map中、删除map成员)

1. 声明 map

  • 语法
var MapName map[keyType]valueType
  • 语法示例
var warlords map[string]string
  • 仅声明的map为空
package main

import "fmt"

func main() {
	var warlords  map[string]string
	if warlords == nil {
		fmt.Printf("map为空")
	}else{
		fmt.Printf("map为:%+v",warlords)
	}
}

结果

map为空

2. 初始化 map

  • 语法
MapName := make(map[keyType]valueType)
  • 语法示例
warlords := make(map[string]string)
  • 初始化之后,map不为空
package main
import "fmt"

func main() {
	warlords := make(map[string]string)
	if warlords == nil {
		fmt.Printf("map为空")
	}else{
		fmt.Printf("map为:%+v",warlords)
	}
}
  • 结果显示
map为:map[]

3. map赋值

3.1 直接声明并赋值

在函数内可以直接声明并赋值

  • 语法
mapName := map[string]string{key1:value1,key2:value2……}
  • 语法示例
var warlords  = map[string]string{"刘备":"徐州","袁绍":"河北","马腾":"西凉","刘表":"荆州"}
  • 完整示例
package main

import "fmt"

func main() {
	var warlords  = map[string]string{"刘备":"徐州","袁绍":"河北","马腾":"西凉","刘表":"荆州"}
	if warlords == nil {
		fmt.Printf("map为空")
	}else{
		fmt.Printf("map为:%+v",warlords)
	}
}

结果

map为:map[刘备:徐州 刘表:荆州 袁绍:河北 马腾:西凉]

说明:
如上可见,map是没有顺序的,打印出的结果和我们赋值的顺序并不一致。

3.2 分别定义每一组键值对

  • 语法
MapName[key1] = value1
  • 语法示例
	warlords["孙权"] = "江东"
  • 完整示例
package main
import "fmt"

func main() {
	//warlords := make(map[string]string)
	var warlords  = map[string]string{"刘备":"徐州","袁绍":"河北","马腾":"西凉","刘表":"荆州"}
	warlords["孙权"] = "江东"
	fmt.Printf("map为:%+v",warlords)
}

语法

map为:map[刘备:徐州 刘表:荆州 孙权:江东 袁绍:河北 马腾:西凉]

4. 遍历map

  • 语法
for key,value := range MapName {
	……
	}
  • 完整示例
package main

import "fmt"

func main() {
	var warlords  = map[string]string{"刘备":"徐州","袁绍":"河北","马腾":"西凉","刘表":"荆州"}
	for name,territory := range warlords {
		fmt.Println(name,":",territory)
	}
}

结果

刘备 : 徐州
袁绍 : 河北
马腾 : 西凉
刘表 : 荆州

5. 判断key是否在map中

  • 语法
if value,ok := MapName[key];ok{
    ……
}
  • 完整示例
package main

import "fmt"

func main() {
	//定义map
	var warlords  = map[string]string{"刘备":"徐州","袁绍":"河北","马腾":"西凉","刘表":"荆州"}
	//查询刘备的信息
	SearchTerritory("刘备",warlords)
    //查询曹操的信息
	SearchTerritory("曹操",warlords)
}

// SearchTerritory 定义一个查询函数
func SearchTerritory(name string,warlords map[string]string)(){
	if territory,ok := warlords[name];ok {
		fmt.Printf("===========================\n%q 的信息已查到\n势力范围:%q\n",name,territory)
	}else{
		fmt.Printf("===========================\n未查到 %q 的信息",name)
	}
}

结果

===========================
"刘备" 的信息已查到
势力范围:"徐州"
===========================
未查到 "曹操" 的信息

6. 删除成员(delete())

  • 语法
delete(MapNam, key)
  • 语法示例

  • 4.2 示例
package main

import "fmt"

func main() {

	var warlords  = map[string]string{"刘备":"徐州","袁绍":"河北","马腾":"西凉","刘表":"荆州"}
	fmt.Println("原map:",warlords)

	delete(warlords,"刘表")
	fmt.Println("现map:",warlords)

}

结果

原map: map[刘备:徐州 刘表:荆州 袁绍:河北 马腾:西凉]
现map: map[刘备:徐州 袁绍:河北 马腾:西凉]

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在C++,`std::map` 是一种关联容器,用于存储键值对(key-value pairs),其键是唯一的。当你想要给 `std::map` 进行赋值时,有几种常见的操作: 1. **直接赋值**: 如果你想替换整个容器的内容,可以直接使用赋值运算符 `=`。例如: ```cpp std::map<int, std::string> oldMap; // ... 填充 oldMap std::map<int, std::string> newMap = { /* 新的键值对列表 */ }; // 或者用构造函数 oldMap = newMap; // 现在oldMap的内容被newMap替换 ``` 2. **更新部分映射**: 如果只想更新部分键值对而不替换整个容器,可以遍历旧容器并逐个修改: ```cpp for (const auto &pair : oldMap) { if (/* 条件判断 */) { newMap[pair.first] = pair.second; // 更新新map } } ``` 3. **利用`std::map`的迭代器**: 使用迭代器可以在不改变原始容器的情况下,对映射进行修改: ```cpp for (auto it = oldMap.begin(); it != oldMap.end(); ++it) { // 更新映射项... newMap[it->first] = it->second; } ``` 4. **`std::copy_if`或`std::move_if_`**: 如果需要更复杂的筛选和转换,可以借助 `std::copy_if` 或 `std::move_if` 函数配合迭代器。 记得在赋值前后检查容器是否正确初始化,并确保键的唯一性,因为 `std::map` 是不允许插入具有相同键的元素的。 **相关问题:** 1. `std::map` 的赋值操作是否会触发拷贝构造函数或移动构造函数? 2. 如果需要保留旧容器的状态,除了赋值还有什么方法? 3. 对于大量数据,如何避免频繁的复制或移动?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄德公笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值