set and map

SET

一个集合(set)是一个容器,它其中所包含的元素的值是唯一的。这在收集一个数据的具体值的时候是有用的。集合中的元素按一定的顺序排列,并被作为集合中的实例。如果你需要一个键/值对(pair)来存储数据,map是一个更好的选择。一个集合通过一个链表来组织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些慢。

  下面是一个例子:

//程序:set演示
//目的:理解STL中的集合(set)

#include <string>
#include <set>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
set <string> strset;
set <string>::iterator si;
strset.insert("cantaloupes");
strset.insert("apple");
strset.insert("orange");
strset.insert("banana");
strset.insert("grapes");
strset.insert("grapes");
for (si=strset.begin(); si!=strset.end(); si++)
{ cout << *si << " "; }
cout << endl;
return 0;
}

// 输出: apple banana cantaloupes grapes orange
//注意:输出的集合中的元素是按字母大小顺序排列的,而且每个值都不重复。

 

 

MAP

 

Map是一个通过key(键)来获得value(值)的模板类。

  另一个问题是你希望在map中使用自己的类而不是已有的数据类型,比如现在已经用过的int。建立一个“为模板准备的(template-ready)”类,你必须确保在该类中包含一些成员函数和重载操作符。下面的一些成员是必须的:

  缺省的构造函数(通常为空)

  拷贝构造函数

  重载的”=”运算符

  你应该重载尽可能多的运算符来满足特定模板的需要,比如,如果你想定义一个类作为 map中的键(key),你必须重载相关的运算符。但在这里不对重载运算符做过多讨论了。

//程序:映射自定义的类。
//目的:说明在map中怎样使用自定义的类。

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

class CStudent
{
 public :
  int nStudentID;
  int nAge;
 public :
  //缺省构造函数——通常为空
  CStudent() { }
  // 完整的构造函数
  CStudent(int nSID, int nA) { nStudentID=nSID; nAge=nA; }
  //拷贝构造函数
  CStudent(const CStudent& ob)
  {
   nStudentID=ob.nStudentID; nAge=ob.nAge; }
  // 重载“=”
  void operator = (const CStudent& ob)
  {
   nStudentID=ob.nStudentID; nAge=ob.nAge;
  }
};

int main(int argc, char* argv[])
{
 map <string, CStudent> mapStudent;

 mapStudent["Joe Lennon"] = CStudent(103547, 22);
 mapStudent["Phil McCartney"] = CStudent(100723, 22);
 mapStudent["Raoul Starr"] = CStudent(107350, 24);
 mapStudent["Gordon Hamilton"] = CStudent(102330, 22);

 // 通过姓名来访问Cstudent类中的成员
 cout << "The Student number for Joe Lennon is " <<
 (mapStudent["Joe Lennon"].nStudentID) << endl;

 return 0;
}

zjfc----1116 {A}+{B}

 

ContractedBlock.gif ExpandedBlockStart.gif Code
#include<cstdio>
#include
<set>
using namespace std;
int main()
{
    
set <int> a;
    
set <int>::iterator it;
    
int n,m,d;
    
while(scanf("%d %d",&n,&m)!=EOF){
        
while(n--){
            scanf(
"%d",&d);
            a.insert(d);
        }
        
while(m--){
            scanf(
"%d",&d);
            a.insert(d);
        }
        
for(it=a.begin(),m=0;it!=a.end();it++){
            
if(m==0){
                printf(
"%d",*it);m++;}
            
else
                printf(
" %d",*it);
        }
        printf(
"\n");
        a.clear();
    }
}

转载于:https://www.cnblogs.com/pandy/archive/2009/05/01/1447344.html

<think>首先,用户的问题是:“请问ArkTS Map Set 使用方法”,翻译成英文是“How to use Map and Set in ArkTS”。用户意图是了解在ArkTS编程语言中如何使用MapSet数据结构。 从系统指令中,我需要: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 确保回答真实可靠。 - 在行内数学表达式使用$...$格式,但用户的问题是关于编程的,可能不涉及数学表达式,所以我可以忽略这个,除非必要。 - 独立公式使用$$...$$格式,但同样,可能不适用。 - LaTeX语法正确。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 参考提供的引用: - 引用[1]:关于ArkTS函数语法和作用域。 - 引用[2]:关于ArkTS数组和函数的基本使用。 - 引用[3]:关于Map的forEach方法。 - 引用[4]:关于异步并发和Promise。 这些引用不是用户直接需求的,但用户意图是了解MapSet的使用,所以我应该基于这些引用和一般知识来回答。 关键点: - ArkTS是基于TypeScript的,所以语法类似TypeScript。 - MapSet是ES6引入的数据结构,TypeScript(和ArkTS)支持它们。 回答结构: 1. **介绍MapSet**:简要解释什么是MapSet。 2. **Map的使用方法**: - 如何声明和初始化Map。 - 常用方法:set, get, has, delete, clear, forEach等。 - 示例代码。 3. **Set的使用方法**: - 如何声明和初始化Set。 - 常用方法:add, has, delete, clear, forEach等。 - 示例代码。 4. **注意事项**:可能包括类型注解、异步处理等。 5. **生成相关问题**:在最后添加相关问题。 使用引用: - 引用[3]提到Map的forEach方法,所以我可以在讨论Map的forEach时引用它。 - 其他引用可能相关,但用户问题聚焦于MapSet,所以我主要用引用[3]。 - 自然地添加引用标识,例如在提到forEach时添加[^3]。 确保回答真实可靠:基于ArkTS文档或可靠来源。既然我有引用,我可以基于它们。 完整回答大纲: 1. 开头:介绍MapSet在ArkTS中的重要性。 2. Map部分: - 声明:`let map = new Map<K, V>();` - 方法:set, get, has, delete, forEach(引用[3])。 - 示例代码。 3. Set部分: - 声明:`let set = new Set<T>();` - 方法:add, has, delete, forEach。 - 示例代码。 4. 注意事项:如类型安全、性能等。 5. 结尾:总结。 6. 相关问题:生成3-5个相关问题。 生成相关问题: - 基于用户问题,例如: 1. 如何在ArkTS中遍历MapSet? 2. MapSet在ArkTS中的性能如何? 3. ArkTS中Map和Object的区别? 4. 如何处理MapSet的异步操作?(引用[4]可能相关) 5. ArkTS中MapSet的常见用例? 最后,确保回答是中文。</think>### ArkTS 中 MapSet 的使用方法 ArkTS 是基于 TypeScript 的编程语言,常用于 HarmonyOS 应用开发。MapSet 是两种常用的集合数据结构,分别用于存储键值对和唯一值集合。下面我将逐步介绍它们的声明、初始化、常用方法及示例代码,确保内容真实可靠,基于官方文档和最佳实践。 #### 1. **Map 的使用方法** Map 是一种键值对集合,键可以是任意类型(如字符串、数字),值也可以是任意类型。它支持高效的查找、添加和删除操作。 - **声明和初始化**: - 使用 `new Map<K, V>()` 创建,其中 `K` 表示键类型,`V` 表示值类型(类型可省略,由编译器推断)。 - 示例: ```typescript // 声明一个 Map,键为字符串,值为数字 let map: Map<string, number> = new Map(); // 初始化时添加数据 let initializedMap = new Map([ ["key1", 10], ["key2", 20] ]); ``` - **常用方法**: - `set(key, value)`: 添加或更新键值对。 - `get(key)`: 获取键对应的值,如果键不存在则返回 `undefined`。 - `has(key)`: 检查键是否存在,返回布尔值。 - `delete(key)`: 删除指定键的条目。 - `clear()`: 清空所有条目。 - `size`: 属性,返回 Map 的大小。 - `forEach(callbackFn)`: 遍历 Map,支持修改操作(如引用[3]所示)[^3]。回调函数格式:`(value, key, map) => void`。 示例代码: ```typescript // 创建 Map let userMap = new Map<string, string>(); // 添加数据 userMap.set("name", "Alice"); userMap.set("age", "30"); // 获取数据 console.log(userMap.get("name")); // 输出: Alice // 检查键是否存在 console.log(userMap.has("age")); // 输出: true // 遍历 Map userMap.forEach((value, key) => { console.log(`${key}: ${value}`); // 输出: name: Alice, age: 30 }); [^3] // 删除数据 userMap.delete("age"); console.log(userMap.size); // 输出: 1 ``` - **注意事项**: - Map 的键是唯一的,重复设置会覆盖旧值。 - 类型注解可增强代码可读性,但编译器可推断类型(如引用[1]所示)[^1]。 - 在异步操作中,结合 Promise 处理 Map 数据(如引用[4])[^4]。 #### 2. **Set 的使用方法** Set 是一种存储唯一值的集合,自动去重。适用于需要确保元素不重复的场景,如过滤数组重复项。 - **声明和初始化**: - 使用 `new Set<T>()` 创建,其中 `T` 表示元素类型。 - 示例: ```typescript // 声明一个 Set,元素为数字 let set: Set<number> = new Set(); // 初始化时添加数据 let initializedSet = new Set([1, 2, 3]); ``` - **常用方法**: - `add(value)`: 添加元素(如果已存在,则忽略)。 - `has(value)`: 检查元素是否存在。 - `delete(value)`: 删除元素。 - `clear()`: 清空所有元素。 - `size`: 属性,返回 Set 的大小。 - `forEach(callbackFn)`: 遍历 Set,回调函数格式:`(value, valueAgain, set) => void`(Set 中键和值相同)。 示例代码: ```typescript // 创建 Set let numberSet = new Set<number>(); // 添加数据(自动去重) numberSet.add(1); numberSet.add(2); numberSet.add(1); // 重复值,被忽略 // 检查元素是否存在 console.log(numberSet.has(2)); // 输出: true // 遍历 Set numberSet.forEach((value) => { console.log(value); // 输出: 1, 2 }); // 删除数据 numberSet.delete(1); console.log(numberSet.size); // 输出: 1 ``` - **注意事项**: - Set 不存储键,只存储值,因此 `forEach` 的回调中 `value` 和 `key` 相同。 - 结合数组使用,可快速去重:`let uniqueArray = [...new Set(array)];`。 - 在函数中使用时,注意作用域(如引用[1])[^1]。 #### 3. **通用建议** - **类型安全**:ArkTS 支持类型推断,但显式类型注解(如 `Map<string, number>`)能减少错误(参考引用[2])[^2]。 - **性能**:MapSet 的查找、插入操作平均时间复杂度为 $O(1)$,优于普通对象。 - **异步处理**:在异步操作中(如 I/O 任务),使用 `async/await` 或 Promise 处理 Map/Set 数据(如引用[4])[^4]。 - **实际应用**:适用于缓存管理(Map)、用户权限集合(Set)等场景。 通过以上步骤,您可以在 ArkTS 中高效使用 MapSet。如果有具体场景需求,可提供更多细节以深入分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值