deque、list、链表性能比较(用于头部插入,尾部出来的情形)
2014-08-18 10:07
323 查看
singLink.h
运行结果:
#include <cstdlib> #include <iostream> #include <iomanip> #include <stdexcept> #include <iostream> using namespace std; class Node { public: int element; Node *next; Node *previous; Node(int element, Node *next, Node *previous) { this->element = element; this->next = next; this->previous = previous; } }; class LinkedList { public: LinkedList(); void addFirst(int); void addLast(int); void add(int index, int element); int getFirst(); int getLast(); int get(int); int removeFirst(); int removeLast(); int remove(int); void iterate(); private: Node *header; int size; };singLink.cpp
#include "singLink.h" /* * 构造方法。 * 生成一个空的节点介于表头和表尾之间,初始前后指针都指向自己。 */ LinkedList::LinkedList() { header = new Node(NULL, NULL, NULL); header->next = header; header->previous = header; size = 0; } /* * 在链表头部添加一个元素。 * 生成一个新的节点,向前指向空节点,向后指向原来空节点的下一个节点,即原来的第一个节点。 * 空节点向后指向此节点,原来的第一个节点向前指向此节点。 */ void LinkedList::addFirst(int i) { header->next = new Node(i, header->next, header); header->next->next->previous = header->next; ++size; } /* * 在链表最后添加一个元素。 * 生成一个新的节点,向前指向原来空节点的前一个节点,即原来的最后一个节点,向后指向空节点。 * 原来的最后一个节点向后指向此节点,空节点向前指向此节点。 */ void LinkedList::addLast(int i) { header->previous = new Node(i, header, header->previous); header->previous->previous->next = header->previous; ++size; } /* * 在指定的索引前插入一个元素。0 <= 索引 <= 链表长度。 * 如果索引值小于链表长度的一半,向后(正向)迭代获取索引值位置的节点,反之则向前(反向)。 * 生成一个新的节点,向前指向原来这个位置的节点的前一个节点,向后指向原来这个位置的节点。 * 原来这个位置的节点的前一个节点向后指向此节点,原来这个位置的节点向前指向此节点。 * (在指定的索引删除一个元素实现方法类似) */ void LinkedList::add(int index, int i) { if(index > size || index < 0) { cout << "Exception in add(): Index out of bound." << '\n'; return; } Node *entry; if(index < size / 2) { entry = header->next; for(int i = 0; i < index; ++i) entry = entry->next; } else { entry = header; for(int i = size; i > index; --i) entry = entry->previous; } entry->previous->next = new Node(i, entry, entry->previous); entry->previous = entry->previous->next; ++size; } /* * 获取链表第一个元素。 * 空节点向后指向的节点即是第一个元素。 */ int LinkedList::getFirst() { if(!size) cout << "Exception in getFirst(): List is empty." << '\n'; return header->next->element; } /* * 获取链表最后一个元素。 * 空节点向前指向的节点即是最后一个元素。 */ int LinkedList::getLast() { if(!size) cout << "Exception in getLast(): List is empty." << '\n'; return header->previous->element; } /* * 删除并返回链表第一个元素。 * 链表第二个节点向前指向空节点,空节点向后指向第二个节点。 */ int LinkedList::removeFirst() { int remove = header->next->element; header->next->next->previous = header; header->next = header->next->next; --size; return remove; } /* * 删除并返回链表最后一个元素。 * 链表倒数第二个节点向后指向空节点,空节点向前指向倒数第二个节点。 */ int LinkedList::removeLast() { int remove = header->previous->element; header->previous->previous->next = header; header->previous = header->previous->previous; --size; return remove; } /* * 用来输出所有元素的迭代方法。 */ void LinkedList::iterate() { if(!size) { cout << "Exception in iterate(): List is empty." << '\n'; return; } for(Node *entry = header->next; entry != header; entry = entry->next) cout << entry->element << " "; cout << '\n'; }测试主函数:
#include <iostream> #include <time.h> #include <list> #include <deque> using namespace::std; #include "singLink.h" struct fuck { int a,b,c; }; int main() { int len = 10000000; list<fuck> l(len); deque<fuck> d; LinkedList link; LARGE_INTEGER litmp; ::QueryPerformanceCounter(&litmp); LONGLONG sllStartTime = litmp.QuadPart; // 获得初始值 for (int i=0; i < len; i++) { static fuck data; data.a = i; data.b = i; data.c = i; d.push_front(data); } for (int i=0; i < len; i++) { fuck f = (fuck)(d.front()); d.pop_back(); } ::QueryPerformanceCounter(&litmp); LONGLONG sllEndTime = litmp.QuadPart; // 获得初始值 cout << sllEndTime - sllStartTime << endl; ::QueryPerformanceCounter(&litmp); sllStartTime = litmp.QuadPart; // 获得初始值 for (int i=0; i < len; i++) { static fuck data; data.a = i; data.b = i; data.c = i; l.push_front(data); } for (int i=0; i < len; i++) { fuck f = (fuck)(l.front()); l.pop_back(); } ::QueryPerformanceCounter(&litmp); sllEndTime = litmp.QuadPart; // 获得初始值 cout << sllEndTime - sllStartTime << endl; ::QueryPerformanceCounter(&litmp); sllStartTime = litmp.QuadPart; // 获得初始值 for (int i=0; i < len; i++) { static fuck data; data.a = i; data.b = i; data.c = i; link.addLast(i); } for (int i=0; i < len; i++) { int f = (int)(link.getFirst()); link.removeFirst(); } ::QueryPerformanceCounter(&litmp); sllEndTime = litmp.QuadPart; // 获得初始值 cout << sllEndTime - sllStartTime << endl; system("pause"); return 0; }
运行结果:
相关文章推荐
- 双向链表容器list的头部、尾部、中间的插入
- STL容器 vector,list,deque 性能比较
- STL容器 vector,list,deque 性能比较
- 链表的基本操作 从头部插入 尾部插入 中间插入 删除节点
- STL容器 vector,list,deque 性能比较
- QLinkedList和std::forward_list(都是双向链表,不支持operator[],好处可能是插入和删除都比较快)
- STL容器类vector,list,deque性能的比较
- STL容器 vector,list,deque 性能比较
- 单链表的建立(头部延长、尾部延长)、插入操作、删除操作(无头结点的删除、有头结点的删除)
- vector,list,deque 性能比较
- 《Java数据结构与算法》笔记-CH5-链表-8实现双链表,头部和尾部插入和删除
- 算法研究之——链表的一些操作(创建、打印,在头部、中间、尾部插入节点)
- STL容器 vector,list,deque 性能比较
- 关于LinkedList和ArrayList 插入元素的性能比较疑惑,知道的请指教......
- list与vector的尾部插入删除效率比较
- List、Vector插入性能比较
- stl中容器string vector list deque 比较
- vector,list,deque的比较
- List和Dictionary的Contains方法性能比较
- .NET批量大数据插入性能分析及比较(2.普通插入与拼接sql批量插入)