数组函数迭代执行

实现函数顺序执行,并用上一个函数的返回值作为参数传给下一个函数。

const f1 = (name) => {
	console.log(name)
	return name + 'f1'
}

const f2 = (name) => {
	console.log(name)
	return name + 'f2'
}

const f3 = (name) => {
	console.log(name)
	return name + 'f3 '
}

const list = [f1, f2, f3]

list.reduce((a, b) => {
	return b(a)
}, '名字')

### 动态数组迭代器的使用方法与实现细节 #### 1. 迭代器的概念 迭代器是一种设计模式,用于提供一种方式顺序访问聚合对象中的各个元素,而不需暴露该对象的内部表示。对于动态数组而言,迭代器允许开发者以统一的方式遍历其中的元素。 在 C++ 的 `std::vector` 和 Java 的 `ArrayList` 中,都实现了各自的迭代器机制。以下是两种语言中迭代器的具体实现和使用方法: --- #### 2. C++ 中动态数组 (std::vector) 的迭代器实现与使用 C++ 的 `std::vector` 提供了多种类型的迭代器,包括前向迭代器 (`forward_iterator`)、随机访问迭代器 (`random_access_iterator`) 等。这些迭代器支持的操作包括但不限于增减索引、解引用以及比较两个迭代器是否相等。 ##### **基本语法** ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 获取起始和结束迭代器 auto it_begin = vec.begin(); // 指向第一个元素 auto it_end = vec.end(); // 超过最后一个元素的位置 // 遍历 vector 并打印每个元素 while (it_begin != it_end) { std::cout << *it_begin << " "; // 解引用迭代器获取当前值 ++it_begin; // 移动到下一个位置 } return 0; } ``` ##### **实现细节** - `begin()` 返回指向第一个元素迭代器。 - `end()` 返回一个超出最后一位的有效迭代器。 - 当修改动态数组的内容时(如插入或删除),某些情况下可能导致现有迭代器失效[^1]。 --- #### 3. Java 中动态数组 (ArrayList) 的迭代器实现与使用 Java 的 `ArrayList` 类也内置了一个名为 `Iterator` 的接口,用于安全地遍历列表内容。此外还有一种增强型迭代器——`ListIterator`,它可以双向移动并支持更多功能。 ##### **基本语法** ```java import java.util.ArrayList; import java.util.Iterator; public class Main { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); // 创建迭代器实例 Iterator<String> iterator = list.iterator(); // 利用 hasNext 方法判断是否有下一项 while (iterator.hasNext()) { String element = iterator.next(); System.out.println(element); // 删除符合条件的项 if ("B".equals(element)) { iterator.remove(); // 安全移除当前元素 } } } } ``` ##### **注意事项** 直接调用 `list.remove(index)` 可能会引发并发修改异常 (ConcurrentModificationException),这是因为集合被外部线程更改的同时还有其他地方正在读取它[^4]。因此,在循环过程中建议始终通过迭代器自身的 `remove()` 函数执行删除操作。 --- #### 4. 自定义简单版动态数组及其迭代器 为了更清楚地展示迭代器的工作原理,下面给出一段自定义简易版本的动态数组代码,并为其添加基础迭代能力。 ##### **代码示例** ```cpp template<typename T> class SimpleVector { private: T* data; size_t capacity; size_t size; public: explicit SimpleVector(size_t initial_capacity = 10) : data(new T[initial_capacity]), capacity(initial_capacity), size(0) {} ~SimpleVector() { delete[] data; } void push_back(const T& value) { if (size >= capacity) resize(capacity * 2); data[size++] = value; } struct Iterator { T* ptr; bool operator!=(const Iterator& other) const { return ptr != other.ptr; } T& operator*() const { return *ptr; } Iterator& operator++() { ++ptr; return *this; } }; Iterator begin() { return Iterator{data}; } Iterator end() { return Iterator{data + size}; } private: void resize(size_t new_cap) { T* newData = new T[new_cap]; for (size_t i = 0; i < size; ++i) newData[i] = data[i]; delete[] data; data = newData; capacity = new_cap; } }; ``` ##### **测试程序** ```cpp #include <iostream> int main() { SimpleVector<int> sv; sv.push_back(10); sv.push_back(20); for(auto iter = sv.begin(); iter != sv.end(); ++iter){ std::cout << *iter << ' '; } return 0; } // 输出: 10 20 ``` 此例子展示了如何构建自己的容器类及配套的迭代工具,从而更好地理解 STL 库背后的设计理念[^1]. --- #### 性能考量 尽管动态数组具备灵活扩展的优势,但在频繁扩容的情况下效率较低,因为每次都需要重新分配内存并将旧数据拷贝过去。针对这种情况可以通过预先设定较大初始容量或者采用链表替代等方式缓解压力[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值