精华内容
下载资源
问答
  • 数据结构中出现的cout是什么

    千次阅读 2017-04-04 00:03:59
    转载自cout百度百科 http://baike.baidu.com/item/cout?sefr=cr 由于以前学过C,所以这段代码的...由于只是初步介绍,所以那本书只是简单的说cout是C++的“标准输入输出流”对象……这对于我而言实在是一个很深
    转载自cout百度百科
    http://baike.baidu.com/item/cout?sefr=cr
    由于以前学过C,所以这段代码的其它部分在我看来都还算“正常”,然而cout却很独特:既不是函数,似乎也不是C++特别规定出来的像if,for一类有特殊语法的“语句”。由于只是初步介绍,所以那本书只是简单的说cout是C++中的“标准输入输出流”对象……这对于我而言实在是一个很深奥的术语。这还没完,之后又遇见了cin……因为不知底细,从此使用它们的时候都诚惶诚恐,几欲逃回C时代那简明的printf(),毕竟好歹我可以说:我在调用的是一个函数。那有着一长串<<、>>的玩意,究竟算怎么回事呢?我一直想把它们当作关键字,可偏偏不是,而且居然是用C++语言“做”出来的,呵!但printf()用多了就开始有人好心地批判我的程序“C语言痕迹过重”……
    后来随着学习的深入,总算大概明白了cout/cin/cerr/...的鬼把戏:那些东东不过是变着法儿“哄人”,其实说到底还是函数调用,不过这函数有些特殊,用的是运算符重载,确切地说(以下还是以cout为例)是重载了“<<”运算符。我们就让它现出函数的本来面目,请看HelloWorld!的等效版本:
    1
    2
    3
    4
    5
    6
    7
    8
    #include<iostream>
    using namespace std;
    int main()
    {
        cout.operator << ("Hello,World!");
        cout.operator << (endl);
        return 0;
    }
    编译运行,结果与经典版无二。上面程序应该更容易理解了:cout是一个ostream类的对象,它有一个成员运算符函数operator<<,每次调用的时候就会向输出设备(一般就是屏幕啦)输出东东。嗯,这里有一个问题:为什么函数operator<<能够接受不同类型的数据,如整型浮点型、字符串甚至指针,等等呢?
    我想你已经猜到了,没错,就是用运算符重载运算符函数与一般函数基本无异,可以任意重载。标准库的设计者们早已经为我们定制了iostream::operator<<对于各种C++基本数据类型的重载版本,这才使得我们这些初学者们一上来就享受到cout<<"Hello,World!"<<endl;
    cout.operator<<("Hello,World!").operator<<(endl);
    才算“强等效”。究竟可不可以这样写?向编译器确认一下……OK,NoProblem!
    还有为什么可以连续写多个呢?请见如下的定义:
    ostream& std::cout.operator<<();
    注意前面的ostream&表示返回对象的引用,也就是可以继续cout了
    对于cin,则是istream流类的对象,其重载了>>运算符,用法与cout大致相同
    那么cout<<endl;是什么呢?

    转载自:http://www.sjyhome.com/c++-cout-endl;.html

    我们在最初学习C++语言时就接触到"cout<<endl;"这样的语句。我们都知道endl表示换行的意思。我一直习惯这样使用,却并不是清楚其内部实现是怎么样的。今天看《C++ Standard Library, Sec.13.6.1》,才真正弄明白。

    首先,endl是一个操作符(Manipulators),但我们必须知道endl是一个什么类型的变量。endl是跟在”<<“运算符后面,故endl应该是一个参数。其实endl是一个函数名,它是一个"<<"运算符重载函数中的参数,参数类型为函数指针。下面我们看下内部函数实现。

    ostream& ostream::operator << ( ostream& (*op) (ostream&))
    {
    // call the function passed as parameter with this stream   as the argument
    return (*op) (*this);
    }
    
    std::ostream& std::endl (std::ostream& strm)
    {
        // write newline
        strm.put('\n');
        // flush the output buffer
        strm.flush();
        // return strm to allow chaining
        return strm;
    }

    可以看出,运算符重载函数中的函数参数为一个函数指针,其指向一个输入输出均为ostream类引用的函数。而endl正是这样一个函数。所以我们在运行"cout<<endl;"语句时,endl是一个函数参数,类型为函数指针。然后会执行”return (*endl) (*this);“语句,即执行endl函数。endl函数输出一个换行符,并刷新输出缓冲区。

    这样我们知道在标准库中endl是作为一个函数实现的,显然我们也可以直接调用这一函数。我们看下面的测试程序:

    #include<iostream>
    using namespace std;
    
    int main()
    {
        cout<<endl;
        endl(cout);
        return 0;
    }

    其输出为两个空行。”cout<<endl"中,endl是一个类型为函数指针的函数参数,通过运算符重载函数间接调用了endl函数。而“endl(cout)”中,endl是函数名,直接调用了endl函数。


    展开全文
  • 和栈相反,队列是一种先进后出的...队列c++的队列在头文件有队列的定义,使用方式如下//队列 //将元素入队列 queue<int> q; q.push(1); q.push(2); q.push(3); //返回队首(队尾)元素 cout< cout<...
    和栈相反,队列是一种先进后出的线性表,只允许在一端进行插入,另一端删除。在队列中,允许插入的一端叫做队尾,删除的一端叫对头。队列cc5c38dd607f100eb6e7430efd64ca48.png

    c++中的队列

    在头文件中有队列的定义,使用方式如下

    //队列  //将元素入队列   queue<int> q;  q.push(1);  q.push(2);  q.push(3);  //返回队首(队尾)元素   cout<  cout<  //移除队首元素   q.pop();  cout<endl;

    队列的定义(顺序数组表示)

    #define M  100   //最大队列长度//QElemType为预定义类型Typedef struct {   QElemType *base;  //初始化的动态分配存储空间   int  front;            //头指针      int  rear;             //尾指针}SeqQueue;

    初始时 front=rear=0

    空队标志:front==rear

    判断是否为空队

    // 判断队列是否为空 int QueueEmpty(SeqQueue SQ){    // 队头坐标与队尾坐标相等时,即为空队列    if(SQ.front == SQ.rear){         return 1;    }else{        return 0;          }}

    入队

    // 入队操作int EnterQueue(SeqQueue *SQ,QElemType e){    // 边界判断,假如队列满了不能入队    if(SQ->rear == M){         printf("队列已满,不能入队.\n");         return 0;    }    // 新元素入队,需要将队尾指针往后移动    SQ->queue[SQ->rear++] = e;    return 1;}

    出队

    // 出队操作int DeleteQueue(SeqQueue *SQ,QElemType *e){    // 边界判断,假如队列空了不能出队    if(SQ->front == SQ->rear){         printf("队列已空,不能出队.\n");         return 0;    }    // 元素出队,需要将队头指针往后移动    *e = SQ->queue[SQ->front++];    return 1; }

            将顺序队想象为一个循环队列可以极大地节约使用空间

    437e06a8aed6039bd99005f5b1adeec9.png

    循环队列初始化

    int InitQueue (SeqQueue &Q){    Q.base =new QElemType[M]    if(!Q.base) exit(0);    Q.front=Q.rear=0;    return 1;}

    求循环队列长度

    int  QueueLength (SeqQueue Q){    return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; }

    循环队列入队

    int EnQueue(SeqQueue &Q,QElemType e){    if((Q.rear+1)%M==Q.front)  return 0;    Q.base[Q.rear]=e;    Q.rear=(Q.rear+1)%M;     return 1;}

    循环队列出队

    Status DeQueue (Sequeue &Q,QElemType &e){   if(Q.front==Q.rear) return 0;   e=Q.base[Q.front];   Q.front=(Q.front+1)%M;   return 1;}

    队列的基本应用

    打印杨辉三角形

    6cc262123295e72154fc69eb3d6f5742.png

    f40d51b5d2187784c885a034e5250a3a.png

    int s,t;Sequeue q;//队列开始为2个元素s=0; EnQueue(q, 1); EnQueue(q, 1);//打印n行for (i=1; i<=N; i++){//各行间插入一个0   EnQueue (q,0);     //每行i+2个元素   for ( j=1; j<=i+2; j++ ) {      //一个系数 出队                               DeQueue (q,t );    //计算下一行系数,并进队          EnQueue (q, s+t );        s = t;        if ( j != i+2 )        cout << s << ' ';       }    cout<<endl;    }

    优先队列

    普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。通常采用堆数据结构来实现

    在C++中定义的优先队列

    #include#includeusing namespace std;int main(){//优先队列 默认为降序排列  //priority_queue  //priority_queue,greater > q;升序  //priority_queue,less > q 降序   priority_queue<int> q2;  //插入元素 并排序   q2.push(2);   q2.push(1);  q2.push(3);  q2.push(0);  //访问对头元素   cout<  //移除队首   q2.pop();  cout<< q2.top();  // 对于自定义类型 priority_queuevector   }
    1b13e502d4139452788451df4d10ff76.png
    展开全文
  • 最近在学数据结构和算法,想简单模拟一下向量的归并排序 ``` #include using namespace std; class vector { int* num; public: vector(int *k) { num=k; } void mergesort(int,int); ...
  • 最近在学数据结构和算法,靠印象敲了里面的代码时:想模拟有序向量的查找,终端没反应,是时间太久还是没跳出循环? ``` #include using namespace std; template int binsearch(T*A,T const &e,int low,int ...
  • 其涵盖了数据结构中图章节的大部分算法 #include #include #include #include #include #ifndef ONCE_GRAPH #define ONCE_GRAPH const int MAX_NUM=32767; const int QUEUESIZE=100; struct ArcNode {int adjvex; ...
  • cout请输入链表的元素:"; for(i=0;i;i++) { LNode *p; cin>>p->data; p->next=L->next; L->next=p; } return L; } void ShowList(LinkList L) { LinkList p; p=L->next; cout...
  • cout ; is_matched=false; } else { char match; openings.top(match); openings.pop(); is_matched=(symbol=='}'&&match;=='{') ||(symbol==')'&&match;=='(') ||(symbol==']'&&match;=='['); if(!is_...
  • 数据结构图的遍历class LinkedDigraph; class LinkedGraph; template <class T> class LinkedWDigraph; template <class T> class LinkedWGraph; template class LinkedBase: virtual public Network { friend ...
  • #include #include struct student { char name[20]; int age; student* next; }; int main() { using namespace std;... cout请输入要删除的结点姓名(Kaka,Deco或Terry):"; c
    #include <iostream>
    #include <string>
    struct student
    {
    	char name[20];
    	int age;
    	student* next;
    };
    int main()
    {
    	using namespace std;
    	char deleteName[20];
    	cout<<"请输入要删除的结点姓名(Kaka,Deco或Terry):"<<endl;
    	cin>>deleteName;
    	student c={"Terry",30,NULL};
    	student b={"Deco",27,&c};
    	student a={"Kaka",23,&b};
    	student* head=&a;
    	student* pointer=head;
    	student* before=NULL;
    	bool isFind=false;
    	while(pointer)
    	{
    		if(strcmp(deleteName,(*pointer).name)==0)		//寻找删除位置
    		{
    			isFind=true;				//已经找到
    			break;
    		}
    		before=pointer;					//记录删除位置前一结点的地址
    		pointer=(*pointer).next;
    	}
    	if(isFind)
    	{
    		if(before==NULL)  		
    			head=(*head).next;				//删除链表首记录
    		else
    		{
    			(*before).next=(*pointer).next;				//在链表中间或末尾删除
    		}
    	}
    	else
    		cout<<"未找到你输入的项"<<endl;					//未找到输入数据
    	student* coutPointer=head;							//输出链表数据
    	cout<<"Head->";
    	while(coutPointer)							//while(coutPointer != NULL)
    	{
    		cout<<(*coutPointer).name<<"->"<<(*coutPointer).age<<"->";
    		coutPointer=(*coutPointer).next;
    	}
    	cout<<"End"<<endl;
    	return 0;
    }

    展开全文
  • C++数据结构中typedef是什么?typedef的作用?typedef的怎么理解? 总结typedef int a;//此时 int=a可以相互换 #include<iostream> using namespace std; typedef int a;//此时 int=a可以相互换 int main()...

    C++数据结构中typedef是什么?typedef的作用?typedef的怎么理解?

    总结typedef int a;//此时 int=a可以相互换

    #include<iostream>
    using namespace std;
    
    typedef int a;//此时 int=a可以相互换 
    
    int main()
    {
    	int i=10;
    	a j=20;
    	
    	cout<<"i:"<<i<<endl;
    	cout<<"j:"<<j<<endl;
    	return 0; 
    	
    } 
    

    结果
    在这里插入图片描述

    typedef在结构体中的使用请点击这一篇文章

    如果对你有帮助,请 点赞 支持一下,谢谢!!!

    展开全文
  • c++STL常用的数据结构

    千次阅读 2017-06-02 16:00:47
    一.stack(栈) 常见的操作: #include using namespace std; int main() { stack S; S.push(3); S.push(10); S.push(100); cout(); S.pop(); cout();; if(!
  • C++自定义数据结构

    2019-10-04 16:35:54
    C++自定义数据结构 #include <iostream> void selfDefinedDataStructure() { std::cout << "自定义数据结构:" << std::endl; // 自定义Sales_data数据类型 // struct + 类名 + 类体 // 类...
  • #include #include using namespace std; struct BTNode { char data; BTNode* lchild; BTNode* rchild; };// void CreateBTnode(BTNode* &p) { //cout; char ch; cin>>ch
  • 复习数据结构的过程,因为考试使用的是c语言,而我用.net可视化用的比较多,所以在控制台上感觉有些束手束脚,前面队列栈还行,都是线性结构,cout 输出也可以看个大概,但是到树这里,这调试时就让人头大了,...
  • 在学习数据结构的过程收获到了很多的经验:(不喜勿喷,谢谢) 下面的所有提交的题目都是在sdutacm: 总结:数据结构 提交实验代码的时候发现,常常会出现tle:  * 一: 用c++的语言编写的,c++...
  • 关于C++*和&的用法及意义这里不再赘述,在各大网站和论坛有详细且明确的解释。 本文关注 *&,即 *与&同时使用的情况,以及为什么 *&可以实现改变指针。 首先看一段代码: int main(){ int a = 1...
  • 数据结构中我们经常要用到很多预定义的常量,如果每次自己输入,那就比较麻烦啦,在这里,给大家把常用的预定义常量分享出来,下次再用到,直接复制粘贴就好啦。 一、常用头文件 首先自然是常用头文件,因为作者是...
  • 递归的概念;定义是递归的;...数据结构是递归的;在链表寻找等于给定值的结点 并打印其数值 template <class Type> void Print ( ListNode<Type> *f ) { if ( f != NULL) if ( f data == x ) cout ; else Print
  • 机票系统 数据结构

    2013-07-02 13:48:40
    cout剩余票数小于订票数,是否需要列入候补名单?(1、是 2、否)"; cin>>n; Buyreplace(q,Ticket_Amount,n);//进入替补名单 } cout、返回菜单 2、继续"; cin>>i; } } } } void BuyTicket(Flight *q, int ...
  • 数据结构学习笔记

    2018-06-04 21:28:11
    这段时间开始复习数据结构,疯狂恶补相关知识,做了一些笔记。1、构造函数,是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初值,总与new运算符一起运用在创建对象的语句。特别的事,一个...
  • 操纵子(Manipulator) 也称操作符, 是一种功能和类 ios_base的成员函数相同, 但使用更方便的格式控制函数,程序员可以直接在输出流插人操纵子控制程序的输出格式,既简化了程序的编写,又使程序的结构变得更清晰...
  • 数据结构 单链表程序

    2011-06-20 16:05:27
    cout请输入线性表元素的个数!"; cin>>n; cout请输入线性表每个元素!"; for(i=0;i;i++) {cout请输入第"个元素!"; cin>>r[i]; } LinkList<int> b(r,n); //根据数组创建单链表 cout单链表b为:"; ...
  • 数据结构_线性表操作

    2009-05-02 23:00:16
    cout请选择======================\n"; cout* 1.初始化线性表 *\n"; cout* 2.删除线性表所有元素 *\n"; cout* 3.得到线性表的长度 *\n"; cout* 4.检查线性表是否为空 *\n"; cout* 5.得到线性表指定序号元素...
  • 求深度 void BiTDepthNonCur(BiTNode * T,int &depth) { if (!T) { depth = 0;... cout << "test1" << endl; queue<BiTree> q; BiTNode* p = T; q.push(T); int len=0; whi...
  • 这是数据结构中的链式队列的入队代码(是从网上拷贝下来的),我不明白为什么s的next域永远都等于NULL,这样不就不能跟其他结点连起来了吗, int InsertQueue(LinkQueue &Q, QElemType e) { ...
  • 数据结构习题 第 5 章;第5章作业;5-1 ;参考答案;参考答案注意头指针数组;5-7;参考答案;5-12;参考答案;5-13;方法一深度优先搜索;方法二拓扑排序;for ( int i=0 ; i; i + + ) if ( top = = - 1 ) //检测图是否有回路...
  • 数据结构习题代码

    2017-12-05 11:20:00
    设计一个带头结点的单链表删除一个最大值结点的算法。 1 //设计一个带头结点的单链表删除一个最大值结点的算法。... 4 #define test cout<<"****"<<endl; 5 using namespace st...
  • 3.5.4 字符数据在内存的存储形式及使用方法 41 3.5.5 字符串常量 41 3.5.6 符号常量 42 3.6 变量赋初值 42 3.7 各类数值型数据之间的混合运算 43 3.8 算术运算符和算术表达式 44 3.8.1 C运算符简介 44 3.8.2 算术...
  • 数据结构笔记】

    2019-08-21 16:44:34
    不要同时在一个程序使用cout和printf,有时候会出问题 scanf("格式控制",变量地址); scanf("%d",&n); printf("格式控制",变量名称); printf("%d",n); C++ 提供了两种指针运算符: &:取地址...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 369
精华内容 147
热门标签
关键字:

数据结构中cout

数据结构 订阅