stlsort源码
① 为何STL的sort排序效率那么高用的是什么算法
STL的sort在数据量不同的时候,他会自己选用不同的排序算法。比如插入,快排。这些。
下面是说对STL的sort的源码分析的,他有说到这些,你可以参考下
http://www.cnblogs.com/imAkaka/articles/2407877.html
② C++中 std::sort 时间复杂度是多少 是用来sort vector的
一般用的都是快速排序,最好、正常和平均时间复杂度都为O(nlog2n),2为底的对数,最坏情况就是数据已经或者近乎有序,当然就是O(n^2)了
③ C++ STL有哪些经典书籍
经典书籍比较多,其中最经典的就是《C++标准程序库:自修教程与参考手册》。
④ C++源码怎么查看
如果你想看stl里面的源码可以去sgi
下载源代码,download
stl
source
code
去这个网站下载源码,sgi版本的stl代码一般来说可读性比较好,我正在看。
sort函数的代码在stl_algo.h文件里。侯捷有本书叫做《stl源码剖析》
如果是vs2008或者2010可以在microsoft
visual
studio
10.0\vc\crt\src查看
另外还有本书叫做《c标准库》但是现在好像绝版了。
也可以去这个找:在glibc库里,可去其官方网站下载(最新是2。7的),然后查找一下你要的函数。
⑤ 求帮忙解释下C++中std::sort()函数中的参数问题,如何得到需要排序的n数量的问题。详情请看下面:
last不算的, 这是STL的惯例.
STL中的所有算法, first~last这样的参数, 都是不算在内的.
int a[4] 这样的数据排序.
参数就是 first = a last = a+4 一共4个数据, 分别是a+0, a+1, a+2, a+3
last也就是a+4不算在内.
至于内部编码, std::sort的实现是函数模板.
下面是VC编译器的源代码, 在algorithm头文件中. 这个头文件就是STL的算法库.
template<class _RanIt,
class _Diff,
class _Pr> inline
void _Sort(_RanIt _First, _RanIt _Last, _Diff _Ideal, _Pr _Pred)
{ // order [_First, _Last), using _Pred
_Diff _Count;
for (; _ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal; )
{ // divide and conquer by quicksort
pair<_RanIt, _RanIt> _Mid =
_Unguarded_partition(_First, _Last, _Pred);
_Ideal /= 2, _Ideal += _Ideal / 2; // allow 1.5 log2(N) divisions
if (_Mid.first - _First < _Last - _Mid.second)
{ // loop on second half
_Sort(_First, _Mid.first, _Ideal, _Pred);
_First = _Mid.second;
}
else
{ // loop on first half
_Sort(_Mid.second, _Last, _Ideal, _Pred);
_Last = _Mid.first;
}
}
if (_ISORT_MAX < _Count)
{ // heap sort if too many divisions
_STD make_heap(_First, _Last, _Pred);
_STD sort_heap(_First, _Last, _Pred);
}
else if (1 < _Count)
_Insertion_sort(_First, _Last, _Pred); // small
}
⑥ C++ STL for_each 的用法
for_each第三个参数传入的是函数名称,通过模板生成代码后的函数指针,for_each需要调用,可以看看STL的for_each函数的源码。
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
void print(int a)
{
cout << a <<"\t";
}
class myInt
{
public:
void operator()(int x)
{
cout << x << "\t";
}
};
template<int thevalue>
void add(int &ele)
{
ele += thevalue;
}
class AddValue
{
private :
int thevalue;
public:
AddValue(int va) : thevalue(va)
{
}
void operator()(int & element)
{
element += thevalue;
}
};
int main()
{
/*
vector<string> ve;
(istream_iterator<string>(cin),
istream_iterator<string>(),
back_inserter(ve));
sort(ve.begin(),ve.end());
(ve.begin(),ve.end(),
ostream_iterator<string>(cout,"\t"));
*/
vector<int> ve;
for(int i = 0; i< 9; i++)
{
ve.push_back(i);
}
for_each(ve.begin(),ve.end(),print);
cout << endl;
for_each(ve.begin(),ve.end(),myInt());
cout << endl;
cout << "after add --------" << endl;
for_each(ve.begin(),ve.end(),add<10>);
for_each(ve.begin(),ve.end(),print);
cout << endl;
for_each(ve.begin(),ve.end(),AddValue(10));
for_each(ve.begin(),ve.end(),print);
cout << endl;
for_each(ve.begin(),ve.end(),AddValue(*ve.begin()));
for_each(ve.begin(),ve.end(),print);
cout << endl;
}
⑦ List<Int>如何排序或按排序的顺序取出
list:
list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入
由于List的实际存储空间是非连续的,所以,STL中的sort()对它不起作用。只能使用自带的list::sort().默认是升序排序。如果是复杂的数据类型,还得自己写比较函数。示例:
#include<iostream>
#include<list>
#include<algorithm>
usingnamespacestd;
typedeflist<int>LISTINT;
intcmp(constint&a,constint&b){//自定义降序判断函数。
//对自定义或者比较复杂数据类型,可以在这里完成。
returna>b;
}
voidmain()
{
//用LISTINT创建一个list对象
LISTINTlistOne;
//声明i为迭代器
LISTINT::iteratori;
listOne.push_front(3);//插入数据到list中
listOne.push_back(2);
listOne.push_back(1);
listOne.push_back(4);
listOne.push_back(5);
listOne.push_front(6);
cout<<"beforesorted:"<<endl;//排序前输出
for(i=listOne.begin();i!=listOne.end();++i)
cout<<*i<<"";
cout<<endl;
//listOne.sort();//默认升序排序
listOne.sort(cmp);//用自定义判断函数,实现降序排序
cout<<"aftersorted:"<<endl;//排序后输出
for(i=listOne.begin();i!=listOne.end();++i)
cout<<*i<<"";
cout<<endl;
}
⑧ 速求教 掌握STL中的vector,list,set,map容器;掌握sort,find方法
1. 编写一个函数模板, 取const vector 参数并根据vector是否正向逆向都一样而返回true和false值;编写main程序来测试该函数。
2. 编写一个函数模板, 取const list 参数并根据list是否正向逆向都一样而返回true和false; 编写main程序来测试该函数。
3. 编写一个main程序, 使用vector存储用户从键盘输入的n个整数, 利用STL中sort算法排序, 并用find方法查找某个数.
4. 使用set容器存储整型元素, 编写函数求两个集合的交集.
5. 使用map来建立英文单词zero, one, two, three… ten 到 0- 10 数字到映射关系; 输入英文数字 one 后输出数字 1.
6.编写main函数,用map来来统计一篇英文文章中单词出现的频率(为简单起见,假定依次从键盘输入该文章;
7. 模拟网上交易系统的中购物车;
本题目用Order模拟用户的订单,用Cart模拟用户的购物车;具体声明如下:
class Order//描述订单
{
public:
Order(int gid, int gnum);//构造函数;
void print();//显示订购的商品编号: 数量
bool operator == (int gid);//判断当前商品编号是否与参数gid相同,相同返回true,否则返回false
private:
int goods_id; //商品编号
int goods_number;//商品数量
};
class Cart//描述购物车, 存储了多了产品的订单
{
public:
void add(Order* or);//增加一个订单
void print();//显示所有订单信息
bool del(int gid); //如果有商品编号为gid的订单就删除,并返回true,否则返回false
private:
list<Order*> l_goods;//存储了多了产品的订单
};
请实现上述两个类的成员函数,并且利用下面的main程序进行测试。
void main()
{
Cart c;
int n,i;
int gid,gnum;
cout << "你要订购多少商品" <<endl;
cin >> n;
//测试 Cart::add方法
cout << "测试 Cart::add方法---------------" << endl;
for(i = 0;i<n;i++)
{
cout << "请输入第"<< i+1 <<"个订单信息"<<endl;
cin >> gid >> gnum;
c.add(new Order(gid,gnum));
}
//测试Cart::print方法
cout << "你的订单信息如下"<<endl;
c.print();
//测试Cart::del方法
cout <<"测试Cart::del方法, 请输入要删除的订单的产品编号"<<endl;
cin >> gid;
c.del(gid);
cout <<"现在你的订单信息如下"<<endl;
c.print();
}
8.模拟网上拍卖系统中的客户分组
客户类 Client
客户类表示拍卖系统的注册用户。这个类封装了以下私有数据成员: firstname,lastname,email,password。封装了以下的公有成员函数:
(1)默认构造函数:将数据成员初始化化为默认值。
(2)具有四个参数的构造函数:用参数值为数据成员初始化
(3) 拷贝构造;
(4) 访问和存取私有数据成员的方法;
(5)验证密码的函数: virtual bool verifyPasswd(string passwd); 如果参数与对象的用户密码相同返回true,否则返回false。
(6)重载输入运算符函数operator>> ,可以 接受如下格式的客户信息:
firstname \n lastname \n email \n password \n
Group类
Group类表示用户集合.这个类有一个私有数据成员 vector<Client*>, 存储用户的指针。
该类有以下成员函数:
(1)virtual void add(Client* ptr); 增加一个用户指针
(2)virtual iterator begin(); 返回第一个用户指针的迭代器。
(3)virtual iterator end();返回最后一个用户指针的迭代器。
(4)virtual Client* operator[](const string& email);返回邮箱地址与参数相同的用户的地址。
?handout-files.zip 含有以下两个文件:
oGroup.h - class Group 的声明.
oClient.h –class Client 的声明
------Solutions------
考题?
------Solutions------
标题和内容不符。
想掌握那些容器,看书,如 c++ primer
------Solutions------
找本C++的书看看吧。基础
------Solutions------
c++标准程序库和STL源码剖析撒
------Solutions------
《C++ Primer》
⑨ 编写一个sort函数,它用于对任何类型的数组进行排序
如下,为了简便,程序中使用了一些标准库函数,所以需要包含两个头文件,sort()函数利用选择排序算法对数组进行排序,调用时需要传入的参数和标准库函数qsort()一致
#include <stdlib.h>
#include <string.h>
void sort(void *base,unsigned int n,unsigned int width,int (*comp)(void *a,void *b))
{
char *p=(char *)base;
char *te=(char *)malloc(width);
char *ptr;
char *pn=p+width;
const char *cp=p+(n-1)*width;
for (; p<cp; p+=width) {
ptr=p;
for (pn=p+width; pn<=cp; pn+=width)
if ((*comp)(ptr,pn)>0) ptr=pn;
if (ptr!=p) {
memcpy(te,p,width);
memmove(p,ptr,width);
memmove(ptr,te,width);
}
}
free(te);
}
⑩ C++中STL的代码分类有哪些
STL六大组件
1、容器 vector set list map deque
2、算法 sort search erase
3、迭代器 iterators
4、仿函数
5、配接器:修饰容器、仿函数、迭代器的东东
6、配置器:空间配置
学STL建议看<STL源码剖析>一书,个人感觉写的挺详细的