中山做网站比较好,wordpress windows 10,微信公众平台推广,建设电子商务系统网站文章目录 listvectormapset性能比较总结 list
列表#xff08;list#xff09;是C STL中的一种容器类型#xff0c;它是一个双向链表#xff0c;可以在任意位置高效地添加、删除、移动元素。
以下是一些常用的列表操作#xff1a;
创建列表
#include list
std… 文章目录 listvectormapset性能比较总结 list
列表list是C STL中的一种容器类型它是一个双向链表可以在任意位置高效地添加、删除、移动元素。
以下是一些常用的列表操作
创建列表
#include list
std::listint myList;添加元素
myList.push_back(1); // 在列表尾部添加元素
myList.push_front(2); // 在列表头部添加元素
myList.insert(myList.begin(), 3); // 在指定位置插入元素删除元素
myList.pop_back(); // 删除尾部元素
myList.pop_front(); // 删除头部元素
myList.erase(myList.begin()); // 删除指定位置的元素遍历列表
std::listint::iterator it;
for(itmyList.begin(); it!myList.end(); it) {std::cout *it ;
}获取列表大小
std::cout myList.size() std::endl;判断列表是否为空
if(myList.empty()) {std::cout List is empty std::endl;
}清空列表
myList.clear();列表排序
myList.sort(); // 默认从小到大排序
myList.sort(std::greaterint()); // 从大到小排序反转列表
myList.reverse();以上是一些常用的列表操作更多操作可以参考C STL中list的文档。
vector
C中的vector是STL标准模板库中的容器之一用于存储动态大小的元素序列。
以下是vector的常见操作
创建一个空的vector vectorint vec; // 创建一个空的vectorintvectorstring strVec; // 创建一个空的vectorstring在vector末尾添加元素 vec.push_back(1); // 在vector末尾添加一个int类型元素1strVec.push_back(hello); // 在vector末尾添加一个string类型元素hello访问vector中的元素 int firstElem vec[0]; // 访问第一个元素string lastElem strVec.back(); // 访问最后一个元素获取vector的大小 int size vec.size(); // 获取vector中元素的个数bool isEmpty strVec.empty(); // 判断vector是否为空删除vector中的元素 vec.pop_back(); // 删除vector末尾的一个元素strVec.erase(strVec.begin() 2); // 删除vector中索引为2的元素清空vector中所有元素 vec.clear(); // 清空vector中所有元素strVec.resize(0); // 将vector的大小设置为0遍历vector中的所有元素 for (int i 0; i vec.size(); i) {cout vec[i] ;}for (auto s : strVec) {cout s ;}第二种方法可以使用C11中的range-based for循环。
map
C中的map是STL标准模板库中的关联容器之一用于存储键值对。
以下是map的常见操作
创建一个空的map mapstring, int myMap; // 创建一个空的map键为string类型值为int类型在map中插入键值对 myMap.insert(make_pair(apple, 10)); // 在map中插入键为apple值为10的键值对myMap[banana] 20; // 在map中插入键为banana值为20的键值对访问map中的元素或查找键 int value myMap[apple]; // 访问键为apple的值auto it myMap.find(banana); // 查找键为banana的迭代器if (it ! myMap.end()) {int value it-second; // 获取迭代器指向的值}获取map的大小 int size myMap.size(); // 获取map中键值对的个数bool isEmpty myMap.empty(); // 判断map是否为空删除map中的键值对 myMap.erase(apple); // 删除键为apple的键值对auto it myMap.find(banana);if (it ! myMap.end()) {myMap.erase(it); // 删除迭代器指向的键值对}清空map中的所有键值对 myMap.clear(); // 清空map中的所有键值对遍历map中的所有键值对 for (auto it myMap.begin(); it ! myMap.end(); it) {cout it-first : it-second endl;}for (auto elem : myMap) {cout elem.first : elem.second endl;}第二种方法可以使用C11中的range-based for循环。
set
C中的set是STL标准模板库中的关联容器之一用于存储不重复的元素并按照一定顺序进行排序。
以下是set的常见操作
创建一个空的set setint mySet; // 创建一个空的set元素为int类型在set中插入元素 mySet.insert(10); // 在set中插入元素10mySet.insert(20); // 在set中插入元素20mySet.insert(30); // 在set中插入元素30访问set中的元素或查找元素 auto it mySet.find(20); // 查找元素20的迭代器if (it ! mySet.end()) {int value *it; // 获取迭代器指向的值}获取set的大小 int size mySet.size(); // 获取set中元素的个数bool isEmpty mySet.empty(); // 判断set是否为空删除set中的元素 mySet.erase(20); // 删除元素20auto it mySet.find(30);if (it ! mySet.end()) {mySet.erase(it); // 删除迭代器指向的元素}清空set中的所有元素 mySet.clear(); // 清空set中的所有元素遍历set中的所有元素 for (auto it mySet.begin(); it ! mySet.end(); it) {cout *it endl;}for (auto elem : mySet) {cout elem endl;}第二种方法可以使用C11中的range-based for循环。
性能比较
使用相同的算法对vector、list和set进行插入数据和删除数据操作
//insert number to list,increasing sort
void insert_l(int arg){listint::iterator iter;for(iter gl.begin();iter!gl.end();iter){//ergodic listif(arg*iter){gl.insert(iter,arg);//insert numberbreak;}}if(iter gl.end()){gl.push_back(arg);//push back number}
}
//delete number from list
void delete_l(){default_random_engine e1(seed);//new random engine with seedwhile(!gl.empty()){uniform_int_distributionunsigned u(0,gl.size()-1);listint::iterator iter gl.begin();//using iteratorfor(int i0;iu(e1);i){iter;}gl.erase(iter);//delete number}
}结果
Data SizeVector Time (s)List Time (s)100000.2812570.527096500006.79223.202910000026.824107.94715000060.0688333.013200000106.619807.597
使用set在插入和删除200 000数据总共只用了2.2331秒、而vector用了106.619秒、list用了807.597秒
总结
vector的遍历性能明显比list要快。这是因为vector的元素是存储在一块连续的内存空间中可以直接通过指针进行访问。而list的元素是通过链表相互连接起来的无法直接访问需要遍历整个链表才能访问某个元素因此遍历性能相对较低。 vector和list在不同场景下有不同的优劣势需要根据具体情况选择适合的容器。例如需要随机访问或者高效的遍历操作时可以选择vector需要频繁的插入或者删除操作时可以选择list。 set是基于红黑树实现的红黑树是一种自平衡的二叉查找树它具有快速的插入、删除和查找操作的时间复杂度因此在处理大量数据时set的性能表现会更好。