list.erase
时间: 2023-11-12 14:58:58 浏览: 44
`list.erase` 是 C++ STL 中 `std::list` 容器的成员函数,用于删除指定位置的元素或指定范围内的元素。其语法如下:
```c++
iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
```
其中,第一个版本删除迭代器 `position` 指向的元素,返回指向被删除元素之后元素的迭代器;第二个版本删除迭代器范围 `[first, last)` 内的所有元素,返回指向被删除元素之后元素的迭代器。
相关问题
template <typename Compare>class CustomOrderList {public: void append(order::Order* pOrder) { m_orderList.insert(pOrder); } void remove(order::Order* pOrder) { m_orderList.erase(pOrder); } size_t size() const { return m_orderList.size(); } bool empty() const { return m_orderList.empty(); } template <typename Func> void apply(const Func& func) const { func(m_orderList); }private: std::set<order::Order*, Compare> m_orderList;}; 实现迭代器功能,const版本
可以通过定义一个内部类 Iterator 来实现迭代器功能,其中 const 版本需要返回 const 指针。
具体实现如下:
```c++
template <typename Compare>
class CustomOrderList {
public:
// 内部迭代器类定义
class Iterator {
public:
Iterator(typename std::set<order::Order*, Compare>::const_iterator it) : m_it(it) {}
bool operator==(const Iterator& other) const { return m_it == other.m_it; }
bool operator!=(const Iterator& other) const { return m_it != other.m_it; }
order::Order* operator*() const { return *m_it; }
Iterator& operator++() { ++m_it; return *this; }
private:
typename std::set<order::Order*, Compare>::const_iterator m_it;
};
void append(order::Order* pOrder) {
m_orderList.insert(pOrder);
}
void remove(order::Order* pOrder) {
m_orderList.erase(pOrder);
}
size_t size() const {
return m_orderList.size();
}
bool empty() const {
return m_orderList.empty();
}
// const 版本迭代器
Iterator begin() const {
return Iterator(m_orderList.cbegin());
}
Iterator end() const {
return Iterator(m_orderList.cend());
}
template <typename Func>
void apply(const Func& func) const {
func(m_orderList);
}
private:
std::set<order::Order*, Compare> m_orderList;
};
```
使用示例:
```c++
CustomOrderList<MyCompare> orderList;
// 添加订单
orderList.append(new order::MarketOrder);
orderList.append(new order::LimitOrder);
orderList.append(new order::StopOrder);
// 遍历订单
for (auto it = orderList.begin(); it != orderList.end(); ++it) {
std::cout << (*it)->getType() << std::endl;
}
```
代码优化,添加迭代器 template <typename Compare> class CustomOrderList{ public: CustomOrderList(){ } ~CustomOrderList(){ } void append(order::Order* pOrder){ m_orderList.insert(pOrder); } void remove(order::Order* pOrder){ m_orderList.erase(pOrder); } size_t size()const { return m_orderList.size(); } bool empty(){ return m_orderList.empty(); } template<typename Func> void apply(Func&& func)const{ func(m_orderList); } public: std::set<order::Order*,Compare> m_orderList; };
这段代码看起来已经很简洁了,但还有一些小的优化可以进行:
1. 构造函数和析构函数可以去掉,因为默认的构造函数和析构函数已经能够满足需求。
2. 可以将 `size()` 和 `empty()` 函数声明为 const 成员函数,以表明它们不会修改对象的状态。
3. 可以将 `apply()` 函数的参数类型改为 `const Func&`,以避免拷贝构造函数的调用。
下面是优化后的代码:
```
template <typename Compare>
class CustomOrderList {
public:
void append(order::Order* pOrder) {
m_orderList.insert(pOrder);
}
void remove(order::Order* pOrder) {
m_orderList.erase(pOrder);
}
size_t size() const {
return m_orderList.size();
}
bool empty() const {
return m_orderList.empty();
}
template <typename Func>
void apply(const Func& func) const {
func(m_orderList);
}
private:
std::set<order::Order*, Compare> m_orderList;
};
```