Tabel表—数组和迭代器

本文主要介绍了Lua中的数组相关知识,包括数组索引默认从1开始,键值对形式下表索引可为负数,还介绍了多维数组。同时提到了pairs和ipairs遍历方式,以及迭代函数可自定义,并给出了迭代函数示例。

#取得tabel(键值对)表中的最大索引,不是tabel的个数
Lua中的数组:
array={"lua","C#"}
1、索引默认从1开始的
2、索引可以为负数的(表为键值对的形式)
array = {};
for i=-2,2 do
  array[i] = i*3;
end

for i=-2,2 do
  print(array[i])
end
Lua中的多维数组:
array = {{"a","A"},{"b","B"},{"c","C"}}
for i=1,#array do
  for j=1,#array[i] do
    print(array[i][j])
  end
end

注:pairs:遍历表中所有的key和value
ipairs:遍历数组,按照索引从1开始递增遍历,遇到nil值停止
迭代函数是可以自定义的
--迭代函数会有返回值,返回值会赋值给变量列表
for 变量列表 in 迭代函数,状态变量,控制变量 do
  --循环体
end

function square(state,control)
  if(control>=state) then
    return nil;
  else
    control = control+1;
  return control,control*control;
  end
end

for i,j in square,9,0 do
  print(i,j);
end

### 迭代器的作用 在哈希中,迭代器的主要作用是提供一种统一的接口,用于遍历哈希中的元素。哈希内部通常由数组(或红黑树)组成,以解决哈希冲突。迭代器使得用户可以按需访问哈希中的每一个键值对,而无需关心底层数据结构的具体实现细节。通过迭代器,用户可以实现对哈希的顺序访问、查找、插入删除等操作。 在C++标准库中,`std::unordered_map`提供了迭代器支持,允许用户以类似指针的方式访问哈希中的元素。迭代器不仅简化了哈希的使用,还提高了代码的可读性可维护性。 ### 迭代器的实现方式 哈希迭代器实现通常需要考虑以下几个方面: 1. **遍历数组** 哈希的底层结构是一个数组,每个数组元素可能指向一个链(或红黑树)以处理哈希冲突。迭代器需要能够遍历整个数组,并在每个数组元素上遍历其对应的链(或红黑树)。因此,迭代器通常需要维护两个指针:一个指向当前数组的位置,另一个指向当前链中的节点。 2. **支持前向双向遍历** 哈希迭代器通常支持前向遍历(即从头到尾遍历),有些实现也可能支持双向遍历(即向前向后移动)。为了支持这些操作,迭代器需要记录当前节点的前后关系,并能够在链或红黑树中进行相应的移动。 3. **处理扩容重新哈希** 在哈希进行扩容或重新哈希时,数组的大小可能会发生变化,导致原有的链结构被重新分配到新的数组中。迭代器需要能够正确处理这些变化,确保在扩容后仍然可以继续遍历哈希中的元素。这通常通过在扩容时更新迭代器的内部状态来实现。 4. **处理无效元素** 在遍历过程中,如果某个元素被删除,迭代器需要能够正确跳过该元素,避免访问到无效的内存地址。为此,迭代器通常会维护一个指向当前元素的指针,并在每次移动时检查该指针的有效性。 5. **性能优化** 为了提高遍历效率,迭代器的设计需要尽量减少不必要的操作。例如,在遍历过程中,迭代器可以直接跳过空的数组位置,避免在链中进行不必要的遍历。 ### 示例代码 以下是一个简单的哈希迭代器实现示例,展示了如何遍历哈希中的元素: ```cpp template<typename Key, typename Value> class HashMapIterator { public: using PairType = std::pair<const Key, Value>; HashMapIterator(PairType** table, size_t tableSize, size_t index, PairType* node) : table(table), tableSize(tableSize), index(index), node(node) {} PairType& operator*() const { return *node; } PairType* operator->() const { return node; } HashMapIterator& operator++() { // 移动到下一个节点 if (node != nullptr) { node = node->next; // 假设每个节点有一个next指针 } // 如果当前链已经遍历完,查找下一个非空的数组位置 while (index < tableSize && node == nullptr) { ++index; if (index < tableSize) { node = table[index]; } } return *this; } bool operator==(const HashMapIterator& other) const { return table == other.table && index == other.index && node == other.node; } bool operator!=(const HashMapIterator& other) const { return !(*this == other); } private: PairType** table; // 指向哈希数组 size_t tableSize; // 哈希的大小 size_t index; // 当前数组的位置 PairType* node; // 当前链中的节点 }; ``` ### 总结 哈希迭代器是实现高效遍历的关键组件,它需要处理数组的复杂性,并提供统一的接口供用户使用。通过合理的设计,迭代器可以在保证性能的同时,提供灵活的遍历功能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值