20141025
1、单链表反转(递归非递归)
ListNode *ReverseList(ListNode *pHead) { if(pHead==NULL||pHead->Next==NULL) return pHead; ListNode *previousNode=NULL; ListNode *nextNode=NULL; ListNode *currentNode=pHead; while(currentNode!=NULL) { nextNode=currentNode->Next; currentNode->Next=previousNode; previousNode=currentNode; currentNode=nextNode; } return previousNode; //返回的不是currentNode } ListNode *ReverseList_recursion(ListNode *currentNode) { if(currentNode==NULL||currentNode->Next==NULL) return currentNode; ListNode *nextNode=currentNode->Next; ListNode *PreviousNode=NULL; currentNode->Next=PreviousNode; ListNode *newHead=ReverseList_recursion(nextNode); nextNode->Next=currentNode; return newHead; }
2、单链表是否有环
#include<iostream> #include<malloc.h> using namespace std; typedef struct node { int data; struct node * Next; }ListNode; ListNode *CreateList() { int x=0; int flag=1; ListNode *pHead=(ListNode *)malloc(sizeof(ListNode)); pHead->data=-1; pHead->Next=NULL; ListNode *rear=pHead; while(flag) { cout<<"input data:"; cin>>x; if(x!=0){ ListNode *p=new ListNode[sizeof(ListNode)]; p->data=x; rear->Next=p; rear=p; } else{ flag=0; } } //rear->Next=pHead;有环 rear->Next=NULL;//无环链表 return pHead; } bool CircleInList(ListNode *head) { if(head==NULL) return false; ListNode *pfast,*plow; pfast=head; plow=head; while(pfast!=NULL&&pfast->Next!=NULL)//为了保证pnext=pnext->Next->Next有效,那么pnext->Next!=NULL是条件 { plow=plow->Next; pfast=pfast->Next->Next; if(pfast==plow) return true; } return false; } int main() { ListNode *head=CreateList(); if(CircleInList(head)) { printf("有环\n"); } else { printf("无环\n"); } ListNode *backKth=ReverseKthNode(head,2); printf("%d",backKth->data); }
3、传入函数的参数是按值传递时,一定会调用类的拷贝构造函数。
4、深拷贝和浅拷贝,浅拷贝可能会析构同一块内存两次
#include<iostream> #include<vector> #include<string> using namespace std; class Base { public: Base(): str(NULL) {} ~Base(){ if(str){ static int i=0; cout<<"&Base"<<i++<<"="<<(int *)this<<",str="<<(int *)str<<endl;//输出该对象的地址和str指针的值 delete [] str; } } char *str; }; int main() { Base B; B.str=new char[32]; strcpy(B.str,"trend micro"); vector<Base> *vec=new vector<Base>() ; vec->push_back(B); //B是按值传递的,调用默认了默认拷贝构造函数,从而发生了浅拷贝 delete vec; return EXIT_SUCCESS; }
5、vector的erase函数删除方法
#include<iostream> #include<string> #include<vector> using namespace std; int main() { //iterator的使用陷阱: vector<int> veci; veci.push_back(1); veci.push_back(2); veci.push_back(3); veci.push_back(4); veci.push_back(5); veci.push_back(3); veci.push_back(2); veci.push_back(3); /*for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++) { if( *iter == 3) veci.erase(iter); }*/错误做法 //这样使用是错误的,因为earase结束后,iter变成了野指针,iter++就产生了错误。 for(vector<int>::iterator iter=veci.begin(); iter!=veci.end();) //正确做法 { if( *iter == 3) iter=veci.erase(iter); else iter++ } }
6、pop_只删除,空间大小不变
7、remove和erase合用
#include<iostream> #include<algorithm> #include<string> #include<vector> using namespace std; int main() { vector<int> veci; veci.push_back(1); veci.push_back(2); veci.push_back(3); veci.push_back(3); veci.push_back(4); veci.push_back(5); veci.push_back(6); veci.push_back(7); veci.push_back(8); veci.push_back(9); vector<int>::iterator p=remove(veci.begin(),veci.end(),3); veci.erase(p,veci.end());//一定要包含algorithm头文件,不然remove会被当做另一个删除文件使用的remove函数 }
8、定义对象和对象指针
#include<iostream> #include<algorithm> #include<string> #include<vector> using namespace std; class A { public: A(){} A(int x,int y):x(x),y(y) {} void f() {cout<<"f被调用"<<endl;} private: int x,y; }; int main() { A a(3,4); A b; A c(); //不是定义对象,而是一个函数声明 c.f(); //c不是A的对象,所以出错 A *pa=new A(); A *pa1=new A(3,4); }
9、只有静态整型常量可以在类中初始化
const int a = 1; //error: 只有静态整型常量可以在类中初始化
static const int h = 1; //ok
static const double h1 = 1.0; //error: 只有静态整型常量才能在类中初始化
10、类的静态成员函数不能访问类的非静态成员函数,只能访问静态成员变量
static int getvalue()
{
return a;//a是非静态成员变量
}
11、静态成员变量的初始化要在类的外部
static int A::member=1;
12、类中的常量必须在初始化成员列表中初始化
class A{
public:
A():bb(1){}
const int bb;
}
13\\\\