模拟实现list及匿名对象

发布于:2024-09-18 ⋅ 阅读:(9) ⋅ 点赞:(0)

const_iterator

	typedef __list_iterator<T,T&,T*> iterator;
	typedef __list_iterator<T,const T&,const T*> const_iterator;
public:
	iterator begin()   
	{
		return iterator(_head->_next);
	}
	iterator end()   
	{
		return iterator(_head);
	}
	const_iterator begin() const
	{
		return iterator(_head->_next);
	}
	const_iterator end() const 
	{
		return iterator(_head);
	}

C++匿名对象

C++匿名对象-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/u014583317/article/details/108705360

pop_back

void pop_back()
{
	erase(iterator(_head->_prev));
}
void pop_back()
{
	//erase(iterator(_head->_prev));
	erase(--end());
}

pop_front

void pop_front()
{
	erase(begin());
}

erase

void erase(iterator pos)
{
	assert(pos != end());
	Node* cur = pos._node;
	Node* prev = cur->_prev;
	Node* next = cur->_next;
	prev->_next = next;
	next->_prev = prev;
	delete cur;
}

insert

void insert(iterator pos, const T& x)
{
	Node* cur = pos._node;
	Node* prev = cur->_prev;
	Node* newnode = new Node(x);
	//prev newnode cur
	prev->_next = newnode;
	newnode->_prev = prev;
	newnode->_next = cur;
	cur->_prev = newnode;
}

深浅拷贝

//lt2(lt1)
list(const list<T>& lt)
{
	_head = new Node;
	_head->_next = _head;
	_head->_prev = _head;

	const_iterator it = lt.begin();
	while (it != lt.end())
	{
		push_back(*it);
		++it;
	}
}

优化

for(auto e:lt)
    push_back(e);

operator=

//lt1=lt3
list<T>& operator=(const list<T>& lt)
{
	if (this != &lt)
	{
		clear();
		for (auto e : lt)
			push_back(e);
	}
	return *this;
}

现代写法

//lt1=lt3
list<T>& operator=(const list<T>& lt)
{
	
	swap(_head, lt._head);
	return *this;
}

迭代器和指针的区别

cur和it都可以表示指向一个节点,在物理内存上存的都是这个节点的地址,物理是一样的。

但是因为其类型不一样,故其意义不一样。

比如*cur是一个指针的解引用,取到的值是节点

而*it的本质是去调operator*,返回的是节点中的值。

类型决定其对空间的解释权

注:list中添加元素迭代器不会失效,删除元素时会发生迭代器失效现象。

vector和list的关联