精华内容
下载资源
问答
  • 静态数据成员和静态成员函数
    万次阅读 多人点赞
    2018-08-26 19:18:35

    转载自:https://blog.csdn.net/computer_liuyun/article/details/29235111

    c++中的static静态数据成员和静态成员函数应该是让大家比较头疼的东西,好像也是找工作公司面试中常常问到的东西。我自己也深有体会,在学习c++的过程中,总感觉static很烦人,但是又是一个必须懂的东西,所以今天就对静态数据成员和静态成员函数坐下小结哈!

    一、静态数据成员

    1.静态数据成员怎么去定义?

    在类中声明静态数据成员很简单,是以static关键字表明即可,如下所示

    class Test{
    private:
    	//静态数据成员
    	static int a;
    };
    

    a就是静态数据成员了,在类中只能声明可是不能定义哈!

    要对静态数据成员定义和初始化必须在类的外面也就是在全局作用域中定义,如果定义不给出初值,则默认初值为0

    class Test{
    public:
    	int GetA() const{return a;}
    private:
    	//静态数据成员
    	static int a;
    };
    //int Test::a;如果这样定义不赋予初值则初值为零
    int Test::a = 1;
    #include <iostream>
    int main()
    {
    	Test T;
    	std::cout << T.GetA() << std::endl;
    }
    

    定义时一定要在全局作用域中定义,一定不要在类中定义!

    静态数据成员甚至在类没有任何对象的时候都可以访问,静态成员可以独立访问,无需依赖任何对象的建立

    另外,不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef #define #endif或者#pragma once也不行。

     

    2.静态数据成员被类的所有对象共享,包括该类的派生类对象,基类对象和派生类对象共享基类的静态数据成员

    答:静态数据成员不属于任何对象,类的静态数据成员的存在不依赖于任何类对象的存在,静态数据成员是由类的所有对象共享的。例子如下:

    class Base{
    public:
    	//静态数据成员
    	static int a;
    };
    class Derived : public Base{
     
    };
    //int Test::a;如果这样定义不赋予初值则初值为零
    int Base::a;
    #include <iostream>
    int main()
    {
    	Base B;
    	Derived D;
    	B.a++;
    	std::cout << B.a << std::endl;
    	D.a++;
    	std::cout << D.a << std::endl;
    	
    }
    

    打印结果如下:

    由打印结果看出来,派生类对象和基类对象都是共享基类的静态数据成员,而基类的所有对象也是共享该静态数据成员,且该静态数据成员应该在全局作用域中定义,可以赋予初值也可以不赋予初值,如果不赋予初值,静态数据成员有其默认值。

     

    3.静态数据成员可以作为成员函数的默认形参,而普通数据成员则不可以

    答:不多说,直接看例子马上就明白了哈!

    class Test{
    public:
    	//静态数据成员
    	static int a;
    	int b;
    	void fun_1(int i = a);//正确
    	void fun_2(int i = b);//报错
    };
    

    4.静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用

    答:这个也不多说,直接看例子就可以懂什么意思哈!

    class Test{
    public:
    	//静态数据成员
    	static Test a;//正确
    	Test b;//报错
    	Test *pTest;//正确
    	Test &m_Test;//正确
    	static Test *pStaticObject;//正确
    };
    

    5.静态数据成员在const函数中可以修改,而普通的数据成员是万万不能修改的哈!

    答:看个例子

    class Test{
    public:
    	Test():b(0){}
    	//静态数据成员
    	static int a;//正确
    	int b;
    	void test() const
    	{
    		a++;
    		b++;//const指的不能修改当前调用该函数对象的数据成员
    	}
    };
    int Test::a;
    

    const修饰的时当前this指针所指向的对象是const,但是静态数据成员不属于任何类的对象,它被类的所有对象修改,所以this指针不修饰静态的数据成员,所以可以更改。

     

    二、静态成员函数

    静态成员函数的声明也很简单,就是在类的成员函数前加上static关键字即可,和静态成员一样,静态成员函数也是属于类的,它并不属于任何对象,当调用静态成员函数时应该使用类名和域运算符“∷”,当然也可以使用对象调用操作,但是这样的操作并不意味着静态成员函数属于这个对象,它只是被这个对象共享而已,这样也就决定了静态成员函数中是不能访问本类中的非静态数据成员的,它是不能访问非静态数据成员的,在c++中静态成员函数主要用来访问静态数据成员而不访问非静态数据成员

    1.静态成员函数不能调用非静态成员函数,但是反过来是可以的

    2.静态成员函数没有this指针,也就是说静态成员函数不能使用修饰符(也就是函数后面的const关键字)

    3.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。

    总结:其实声明为静态,不论是静态数据成员还是静态成员函数,它们都是不依赖于对象而存在的,类在定义后并不分配存储空间,而是在定义类的对象的时候才分配存储空间,相反静态的数据成员和静态的成员函数是已经在内存中开辟了内存空间了,所以静态数据成员可以独立的访问在任何类对象没有建立起来都可以访问,并且静态成员函数不可以调用非静态成员函数,因为非静态成员函数只有在类对象建立以后才可以调用,相反则是可以的。我觉得当对某个判断产生怀疑的时候应该去测试,只有验证了才知道是不是对的哈!

    为了能更好阐释静态数据成员和静态成员函数,然后在网上搜了博客,感觉有些例子不错(因找不到最初的出处,所以无法注明请原作者谅解),所以就拿来给大家参考一下哈!

    关于玩篮球的例子很能明显解释静态数据成员和静态成员函数到底是怎么回事

    你们班里面有10个人(10个比如高一一班的对象),体育老师分给你们一个篮球(静态成员函数),你们每个人都带了一个篮球(非静态成员数),你们都很小气,自己的球只能自己拍,要是5对5打比赛,那就只能用那个静态的篮球了(每个人都可以拿来用,但是带来的影响是对全体的)。因此,我可以说那个篮球是高一一班的成员。所以也就是说:静态成员函数是类的成员函数(因为高一二班就不能拿来玩),但是这个篮球最后还是要还给老师的,任何私人不得占有。希望这样你能明白,其实在内存空间里面说白了静态的成员的内存是唯一的一份,就是当你在类外声明他时开辟的,但是非静态函数的空间分配是在你实例化对象时创建的。

    为了使大家更好的理解这两个概念,还是老样子用代码来说明上面文字说明的这一切哈!

    关于学生类的例子

    //定义Student类
    #include <iostream>
    class Student                  
    {
    public:
    //定义构造函数
    Student(int n,int a,float s):num(n),age(a),score(s){ }      
    void total();
    //声明静态成员函数
    static float average();      
    private:
    	int num;
    	int age;
    	float score;
    	//静态数据成员,累计学生的总分
    	static float sum; 
    	//静态数据成员,累计学生的人数
    	static int count;           
    };
    //在全局作用域对静态数据成员初始化,如果不赋予初值,则使用其默认值零
    float Student::sum;                     
    int Student::count;
    //定义非静态成员函数
    void Student::total()                    
    {
    	//累加总分
    	sum+=score;
    	//累计已统计的人数
    	count++;                               
    }
    //定义静态成员函数
    float  Student::average()                  
    {
    	return(sum/count);
    }
    int main()
    {
    	Student stud[3]={    
    	//定义对象数组并初始化
    	Student(1001,18,70),
    	Student(1002,19,78),
    	Student(1005,20,98)
    };
    int n;
    std::cout<<"please input the number of students: ";
     //输入需要求前面多少名学生的平均成绩
    std::cin>>n;                              
    //调用3次total函数
    for(int i=0;i<n;i++)
    {
    	stud[i].total();
    }
    //调用静态成员函数
    std::cout<<"the average score of "<<n<<" students is "<<Student::average( )<<std::endl;
    return 0;
    }
    

    打印输出如下:

     

    对上面的代码做以下说明:

    首先,在主函数中定义了对象数组,存放每个学生的编号、年龄和成绩,其中sum和count是要累计所有学生的总成绩和总的学生人数,我们定义成了静态数据成员,在学生类的成员函数中,我们定义了普通的total成员函数,用来计算所有学生的总成绩和总的学生人数,另外,定义了静态成员函数average,学生类的设计大概如此

    在全局作用域对类中静态数据成员进行了定义,但未赋予初值,这意味着我们采用其默认值。

    在类的普通成员函数toal中可以引用静态数据成员sum和count,可见类的所有成员函数都可以引用类的静态数据成员。

    在类的静态成员函数average中,只能引用类的静态数据成员,不能引用非静态数据成员。

    在主函数中我们调用类的非静态成员函数时只能通过类对象来调用,如stu[i].total,但是对于静态成员函数可以直接通过类名+作用域符号来调用,如

    Student::average。

     

    更多相关内容
  • 静态数据成员和静态数据成员函数

    千次阅读 多人点赞 2016-12-27 15:25:29
    c++的static静态数据成员和静态成员函数应该是让大家比较头疼的东西,好像也是找工作公司面试常常问到的东西。我自己也深有体会,在学习c++的过程,总感觉static很烦人,但是又是一个必须懂的东西,所以今天就...

    c++中的static静态数据成员和静态成员函数应该是让大家比较头疼的东西,好像也是找工作公司面试中常常问到的东西。我自己也深有体会,在学习c++的过程中,总感觉static很烦人,但是又是一个必须懂的东西,所以今天就对静态数据成员和静态成员函数坐下小结哈!


    一、静态数据成员

    1.静态数据成员怎么去定义?

    在类中声明静态数据成员很简单,是以static关键字表明即可,如下所示

    [cpp]  view plain  copy
    1. class Test{  
    2. private:  
    3.     //静态数据成员  
    4.     static int a;  
    5. };  

    a就是静态数据成员了,在类中只能声明可是不能定义哈!

    要对静态数据成员定义和初始化必须在类的外面也就是在全局作用域中定义,如果定义不给出初值,则默认初值为0

    [cpp]  view plain  copy
    1. class Test{  
    2. public:  
    3.     int GetA() const{return a;}  
    4. private:  
    5.     //静态数据成员  
    6.     static int a;  
    7. };  
    8. //int Test::a;如果这样定义不赋予初值则初值为零  
    9. int Test::a = 1;  
    10. #include <iostream>  
    11. int main()  
    12. {  
    13.     Test T;  
    14.     std::cout << T.GetA() << std::endl;  
    15. }  

    定义时一定要在全局作用域中定义,一定不要在类中定义!

    静态数据成员甚至在类没有任何对象的时候都可以访问,静态成员可以独立访问,无需依赖任何对象的建立

    另外,不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef #define #endif或者#pragma once也不行。


    2.静态数据成员被类的所有对象共享,包括该类的派生类对象,基类对象和派生类对象共享基类的静态数据成员

    答:静态数据成员不属于任何对象,类的静态数据成员的存在不依赖于任何类对象的存在,静态数据成员是由类的所有对象共享的。例子如下:

    [cpp]  view plain  copy
    1. class Base{  
    2. public:  
    3.     //静态数据成员  
    4.     static int a;  
    5. };  
    6. class Derived : public Base{  
    7.   
    8. };  
    9. //int Test::a;如果这样定义不赋予初值则初值为零  
    10. int Base::a;  
    11. #include <iostream>  
    12. int main()  
    13. {  
    14.     Base B;  
    15.     Derived D;  
    16.     B.a++;  
    17.     std::cout << B.a << std::endl;  
    18.     D.a++;  
    19.     std::cout << D.a << std::endl;  
    20.       
    21. }  

    打印结果如下:


    由打印结果看出来,派生类对象和基类对象都是共享基类的静态数据成员,而基类的所有对象也是共享该静态数据成员,且该静态数据成员应该在全局作用域中定义,可以赋予初值也可以不赋予初值,如果不赋予初值,静态数据成员有其默认值。


    3.静态数据成员可以作为成员函数的默认形参,而普通数据成员则不可以

    答:不多说,直接看例子马上就明白了哈!

    [cpp]  view plain  copy
    1. class Test{  
    2. public:  
    3.     //静态数据成员  
    4.     static int a;  
    5.     int b;  
    6.     void fun_1(int i = a);//正确  
    7.     void fun_2(int i = b);//报错  
    8. };  


    4.静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用

    答:这个也不多说,直接看例子就可以懂什么意思哈!

    [cpp]  view plain  copy
    1. class Test{  
    2. public:  
    3.     //静态数据成员  
    4.     static Test a;//正确  
    5.     Test b;//报错  
    6.     Test *pTest;//正确  
    7.     Test &m_Test;//正确  
    8.     static Test *pStaticObject;//正确  
    9. };  


    5.静态数据成员在const函数中可以修改,而普通的数据成员是万万不能修改的哈!

    答:看个例子

    [cpp]  view plain  copy
    1. class Test{  
    2. public:  
    3.     Test():b(0){}  
    4.     //静态数据成员  
    5.     static int a;//正确  
    6.     int b;  
    7.     void test() const  
    8.     {  
    9.         a++;  
    10.         b++;//const指的不能修改当前调用该函数对象的数据成员  
    11.     }  
    12. };  
    13. int Test::a;  

    const修饰的时当前this指针所指向的对象是const,但是静态数据成员不属于任何类的对象,它被类的所有对象修改,所以this指针不修饰静态的数据成员,所以可以更改。

    二、静态成员函数

    静态成员函数的声明也很简单,就是在类的成员函数前加上static关键字即可,和静态成员一样,静态成员函数也是属于类的,它并不属于任何对象,当调用静态成员函数时应该使用类名和域运算符“∷”,当然也可以使用对象调用操作,但是这样的操作并不意味着静态成员函数属于这个对象,它只是被这个对象共享而已,这样也就决定了静态成员函数中是不能访问本类中的非静态数据成员的,它是不能访问非静态数据成员的,在c++中静态成员函数主要用来访问静态数据成员而不访问非静态数据成员

    1.静态成员函数不能调用非静态成员函数,但是反过来是可以的

    2.静态成员函数没有this指针,也就是说静态成员函数不能使用修饰符(也就是函数后面的const关键字)

    3.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。


    总结:其实声明为静态,不论是静态数据成员还是静态成员函数,它们都是不依赖于对象而存在的,类在定义后并不分配存储空间,而是在定义类的对象的时候才分配存储空间,相反静态的数据成员和静态的成员函数是已经在内存中开辟了内存空间了,所以静态数据成员可以独立的访问在任何类对象没有建立起来都可以访问,并且静态成员函数不可以调用非静态成员函数,因为非静态成员函数只有在类对象建立以后才可以调用,相反则是可以的。我觉得当对某个判断产生怀疑的时候应该去测试,只有验证了才知道是不是对的哈!


    为了能更好阐释静态数据成员和静态成员函数,然后在网上搜了博客,感觉有些例子不错(因找不到最初的出处,所以无法注明请原作者谅解),所以就拿来给大家参考一下哈!

    关于玩篮球的例子很能明显解释静态数据成员和静态成员函数到底是怎么回事

    你们班里面有10个人(10个比如高一一班的对象),体育老师分给你们一个篮球(静态成员函数),你们每个人都带了一个篮球(非静态成员数),你们都很小气,自己的球只能自己拍,要是5对5打比赛,那就只能用那个静态的篮球了(每个人都可以拿来用,但是带来的影响是对全体的)。因此,我可以说那个篮球是高一一班的成员。所以也就是说:静态成员函数是类的成员函数(因为高一二班就不能拿来玩),但是这个篮球最后还是要还给老师的,任何私人不得占有。希望这样你能明白,其实在内存空间里面说白了静态的成员的内存是唯一的一份,就是当你在类外声明他时开辟的,但是非静态函数的空间分配是在你实例化对象时创建的。

    为了使大家更好的理解这两个概念,还是老样子用代码来说明上面文字说明的这一切哈!

    关于学生类的例子

    [cpp]  view plain  copy
    1. //定义Student类  
    2. #include <iostream>  
    3. class Student                    
    4. {  
    5. public:  
    6. //定义构造函数  
    7. Student(int n,int a,float s):num(n),age(a),score(s){ }        
    8. void total();  
    9. //声明静态成员函数  
    10. static float average();        
    11. private:  
    12.     int num;  
    13.     int age;  
    14.     float score;  
    15.     //静态数据成员,累计学生的总分  
    16.     static float sum;   
    17.     //静态数据成员,累计学生的人数  
    18.     static int count;             
    19. };  
    20. //在全局作用域对静态数据成员初始化,如果不赋予初值,则使用其默认值零  
    21. float Student::sum;                       
    22. int Student::count;  
    23. //定义非静态成员函数  
    24. void Student::total()                      
    25. {  
    26.     //累加总分  
    27.     sum+=score;  
    28.     //累计已统计的人数  
    29.     count++;                                 
    30. }  
    31. //定义静态成员函数  
    32. float  Student::average()                    
    33. {  
    34.     return(sum/count);  
    35. }  
    36. int main()  
    37. {  
    38.     Student stud[3]={      
    39.     //定义对象数组并初始化  
    40.     Student(1001,18,70),  
    41.     Student(1002,19,78),  
    42.     Student(1005,20,98)  
    43. };  
    44. int n;  
    45. std::cout<<"please input the number of students: ";  
    46.  //输入需要求前面多少名学生的平均成绩  
    47. std::cin>>n;                                
    48. //调用3次total函数  
    49. for(int i=0;i<n;i++)  
    50. {  
    51.     stud[i].total();  
    52. }  
    53. //调用静态成员函数  
    54. std::cout<<"the average score of "<<n<<" students is "<<Student::average( )<<std::endl;  
    55. return 0;  
    56. }  

    打印输出如下:


    对上面的代码做以下说明:

    首先,在主函数中定义了对象数组,存放每个学生的编号、年龄和成绩,其中sum和count是要累计所有学生的总成绩和总的学生人数,我们定义成了静态数据成员,在学生类的成员函数中,我们定义了普通的total成员函数,用来计算所有学生的总成绩和总的学生人数,另外,定义了静态成员函数average,学生类的设计大概如此

    在全局作用域对类中静态数据成员进行了定义,但未赋予初值,这意味着我们采用其默认值。

    在类的普通成员函数toal中可以引用静态数据成员sum和count,可见类的所有成员函数都可以引用类的静态数据成员。

    在类的静态成员函数average中,只能引用类的静态数据成员,不能引用非静态数据成员。

    在主函数中我们调用类的非静态成员函数时只能通过类对象来调用,如stu[i].total,但是对于静态成员函数可以直接通过类名+作用域符号来调用,如

    Student::average。

    原文:http://blog.csdn.net/computer_liuyun/article/details/29235111

    展开全文
  • 数据结构:静态查找动态查找

    千次阅读 多人点赞 2019-03-15 15:32:10
    首先无论是静态查找还是动态查找,都要有查找的对象,也就是包含很多同类型数据的“表”,这个“表”可以理解为一个由同类型数据元素组成的一个“集合”,该集合可以用各种容器来存储,例如数组、链表、树等,我们...

    概念

    1、静态查找

    首先无论是静态查找还是动态查找,都要有查找的对象,也就是包含很多同类型数据的“表”,这个“表”可以理解为一个由同类型数据元素组成的一个“集合”,该集合可以用各种容器来存储,例如数组、链表、树等,我们统称这些存储数据的数据结构为——查找表。可见,查找表有时是我们传统意义的表,有时候是很复杂的一种结构。

    静态查找就是我们平时概念中的查找,是“真正的查找”。之所以说静态查找是真正的查找,因为在静态查找过程中仅仅是执行“查找”的操作,即:(1)查看某特定的关键字是否在表中(判断性查找);(2)检索某特定关键字数据元素的各种属性(检索性查找)。这两种操作都只是获取已经存在的一个表中的数据信息,不对表的数据元素和结构进行任何改变,这就是所谓的静态查找。

    2、动态查找

    看到上面静态查找的概念,动态查找就很好理解了,个人总觉得动态查找不像是“查找”,更像是一个对表进行“创建、扩充、修改、删除”的过程。动态查找的过程中对表的操作会多两个动作:(1)首先也有一个“判断性查找”的过程,如果某特定的关键字在表中不存在,则按照一定的规则将其插入表中;(2)如果已经存在,则可以对其执行删除操作。动态查找的过程虽然只是多了“插入”和“删除”的操作,但是在对具体的表执行这两种操作时,往往并不是那么简单。

    哪种查找对应各自查找表,如有序表可以为静态查找表,也可以为动态查找表。依查找方式决定。

    一、静态查找表

    1.顺序查找

    假设每个记录的查找概率相等,顺序查找的平均查找长度:ASL=\sum_{i=1}^{n}P_{i}C^{i} = \frac{1}{n}\sum_{i=1}^{n}(n-i+1)=\frac{n+1}{2}

    假设查找成功与不成功的可能性相同,对每个记录查找概率也相等,则P_{i} = 1/(2n),此时平均查找长度为ASL=\frac{3}{4}(n+1)

    2.有序表查找

    折半查找:这个查找过程类似二叉树,具有n个节点的判定树深度为\left \lfloor log_{2}n \right \rfloor + 1,平均查找长度为ASL=\frac{1}{n}\sum _{j =1}^{h}j*2_{j-1} = \frac{n+1}{n}log_{2}(n+1)-1

    3.索引顺序表的查找(分块查找)

    对子表建立一个索引表,包括两项内容:关键字项(值为该子表内最大关键字)和指针项(指向该子表的第一个记录在表中的位置)。索引表按关键字有序,表或者有序,或者分块有序。

    由于索引项按关键字有序,则确定块的查找可以用顺序表查找,也可以用折半查找,块中记录是任意排列的,在块中只能是顺序查找。

    分块查找由这两种查找算法简单合成。分块查找的平均查找长度为

                                 ASL_{bs} = L_{b} + L_{w}

    其中:L_{b}为查找索引表确定所在块的平均查找长度,L_{w}为在块中查找元素的平均查找长度。

    一般情况下,为进行分块查找,可以将长度为n的表均匀的分成b块,每块含有s个记录;假定表中每个记录的查找概率相等。用顺序查找确定所在块,分块查找的平均查找长度为

                                ASL = \frac{b+1}{2}+\frac{s+1}{2}

    分块查找是折半查找和顺序查找的一种改进方法,折半查找虽然具有很好的性能,但其前提条件时线性表顺序存储而且按照关键码排序,这一前提条件在结点树很大且表元素动态变化时是难以满足的。而顺序查找可以解决表元素动态变化的要求,但查找效率很低。如果既要保持对线性表的查找具有较快的速度,又要能够满足表元素动态变化的要求,则可采用分块查找的方法。

    分块查找的速度虽然不如折半查找算法,但比顺序查找算法快得多,同时又不需要对全部节点进行排序。当节点很多且块数很大时,对索引表可以采用折半查找,这样能够进一步提高查找的速度。

    分块查找由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合于节点动态变化的情况。当增加或减少节以及节点的关键码改变时,只需将该节点调整到所在的块即可。在空间复杂性上,分块查找的主要代价是增加了一个辅助数组。

    平均查找长度:

    以一个牛客网上的题目为例:设顺序线性表的长度为30,分成5块,每块6个元素,如果采用分块查找并且索引表和块内均采用顺序查找,则其平均查找长度为(     )。

    分块查找会分两部分进行,第一步先进行索引表查找判断其在那个字表中,第二步然后进行在字表中的查找
    索引表有5个元素 所以平均查找长度为:(1+5)/2=3
    字表中有6个元素,所以平均查找长度为:(1+6)/2=3.5
    所以总的平均查找长度为3+3.5=6.5

    二、动态查找表

    2.1二叉排序树与AVL树

    2.1.1二叉排序树

    含有n个节点的二叉排序树的平均查找长度和树的形态有关,最好和log_{2}n成正比,当先后插入的关键字有序,构成的二叉排序树蜕变为单支树,树的深度为n,最坏情况,平均查找长度为\frac{n+1}{2}

    2.1.2平衡二叉树(AVL树)

    它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左右子树的深度之差绝对值不超过1。结点平衡因子定义为左子树深度减右子树深度(-1,0,1)。平均查找时间复杂度O(logn)

    2.2B-树和B+树

    一棵m阶B-树,或为空树,或满足下列特性的m叉树:(是一种平衡的多路查找树)

    1. 树中每个节点至多有m棵子树;
    2. 若根节点不是叶子结点,则至少有两棵子树;
    3. 除根之外的所有非终端结点至少有\left \lceil m/2 \right \rceil
    4. 所有非终端结点中包含下列信息数据(n,A_{0},K_{1},...,K_{n},A_{n}),其中K_{i}(i=1...n)为关键字,A_{i}(i = 0...n)为指向子树根结点的指针,且指针A_{i-1}所指子树中所有结点的关键字均小于K_{i}
    5. 所有的叶子结点都出现在同一层次上,且不带信息。

    m阶B+树和m阶B-树的差异在于:

    1. 有n棵子树的结点中含有n个关键字。
    2. 所有叶子结点中包含了全部关键字信息,及指向这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
    3. 所有非终端结点可以看成是索引部分,结点中仅含有其子树(根结点)中最大(或最小) 关键字。

    参考文献:

    数据结构(C语言版),严蔚敏 

    https://blog.csdn.net/pamchen/article/details/8476134

    展开全文
  • GNSS静态测量数据采集与内业解算

    千次阅读 2021-08-25 15:16:09
    4.2 HGO软件数据处理 静态数据处理的一般步骤包括: 新建项目,并设置坐标系统; 导入数据,并编辑文件天线高信息; 基线解算,并根据残差信息进行调整,直到基线质量合格; 网平差,输入控制点信息后,完成自由网平差...

    1 仪器清单

    每次外业前,应将电池充满电,并检查仪器是否齐全。

    GNSS静态测量仪器清单
    名称数量
    接收机5
    连接螺丝5
    测高片5
    基座5
    三脚架5
    钢卷尺5
    接收机电池10
    接收机充电器5
    接收机miniUSB数据线1
    手簿1
    手簿电池1
    手簿充电器1

    另外,还应检查机身剩余内存是否充足、架腿是否稳定、基座能否正常对中整平。

    2 外业采集

    本次使用中海达“华星A12”系列接收机进行外业采集,控制等级为 E 级,采样间隔5s,高度截至角15°,观测时长45min。采用5台接收机,通过 单基准站式的布网方式,一台置于控制点作为公共点,其他4台置于测区,观测两个时段,共9个测站。

    注意:

    • GPS网的基本观测量是表示测站间坐标差的基线向量,若所有基线向量的精度相同,则 GPS网的形状与GPS网的精度和可靠性无关。

    - 单基准站式的布网方式: 单基准站的布网方式,它是以一台接收机作为基准站,在控制点上连续开机观测。其余的接收机在此基准站观测期间,分不同时段进行观测。

    • 若控制点上的基准站在上一时段观测结束后,也进行了关机,则无法与下一时段的观测文件进行同步解算,需要将不同时段分开解算。否则会出现 “网形没有完全连通,无法平差!” 的问题。
      在这里插入图片描述

    3 数据导出

    采用数据线(miniUSB)的方式,连接电脑和接收机,实现观测数据的导出。
    在这里插入图片描述

    miniUSB 数据线

    请参考以下步骤:

    1. 将数据线连接电脑与接收机,打开接收机电源;
    2. 选择 gnss 文件夹,找到测量时段对应的观测文件(修改时间为关机时间),拷贝到电脑即可。

    4 内业处理

    4.1 设置站点名与斜高

    设置之前,应做好原始数据备份。

    根据外业调度表,对GNS文件进行站点名的天线高设置,双击文件夹内的GNS文件即可

    在这里插入图片描述
    对所有GNS文件完成站点名与斜高设置工作,注意时段要对应。

    在这里插入图片描述

    4.2 HGO软件数据处理

    静态数据处理的一般步骤包括:

    1. 新建项目,并设置坐标系统;
    2. 导入数据,并编辑文件天线高信息;
    3. 基线解算,并根据残差信息进行调整,直到基线质量合格;
    4. 网平差,输入控制点信息后,完成自由网平差->84约束平差->当地三维约束平差或二维约束平差;
    5. 导出各种解算报告。

    1. 新建项目

    打开HGO数据处理软件,选择文件-新建项目,设置项目名称与工作目录,确定

    在这里插入图片描述
    在这里插入图片描述
    确定后按需设置项目基本信息

    在这里插入图片描述
    选择控制等级,这里选择 E 级,其他参数默认。

    在这里插入图片描述
    确定之后,选择坐标系统,只需要设置测区对应的中央子午线,其他参数默认

    在这里插入图片描述
    2. 导入文件

    任务建完后,开始加载观测数据文件。选择『文件』-【导入】,在弹出的对话框中选择需要加载的数据类型,按【导入文件】或者【导入目录】,进入文件选择对话框:

    在这里插入图片描述
    当数据加载完成后,系统会显示所有的GPS基线向量,【平面图】会显示整个GPS网的情况。

    在这里插入图片描述

    3. 文件信息编辑

    当数据加载完成后,系统会显示所有的文件,点击中间树形目录中的【观测文件】,并将右边工作区选项卡切换为【文件】,即可查看详细的文件列表。双击某一行,即可弹出编辑界面,这里主要是为了确定天线高,接收机类型,天线类型。按照相同方法完成所有文件天线信息的录入或编辑。用户也可以在文件列表处理直接修改点名、天线类型和天线高信息。

    4. 设置采样间隔、高度截至角

    点击树形目录中的 【基线】,双击一条基线,默认高度截至角15°,采样间隔10s。若与观测时不一致,需要重新设置采样间隔(本次为5s)和高度截至角(本次为15°),保存至选中。注意要逐个修改,不要选择保存至全部,否则两个时段的时间会被设置成相同时间。

    在这里插入图片描述

    4.3 处理基线

    依次选择『基线处理』-> 【处理全部基线】,系统将采用默认的基线处理设置,处理所有的基线向量。

    处理过程中,显示整个基线处理过程的进度。从【基线】列表中也可以看出每条基线的处理情况。

    在这里插入图片描述
    正在处理…

    在这里插入图片描述
    解算完成!

    在这里插入图片描述

    4.4 平差前的设置

    在基线处理完成后,需要对基线处理成果进行检核。假定所有参与解算的基线都合格,通常情况下,如果观测条件良好,一般一次就能成功处理所有的基线。基线解算合格后,还需要根据基线的同步观测情况剔除部分基线,先不删除。

    主要是确定哪些站点是控制点
    

    在树形视图区中切换到【点】,在右边工作区点击【站点】,右击选中的站点,选择【转为控制点】,这些点会自动添加到【控制点】列表中。

    在这里插入图片描述
    转为控制点后,会有▲标识

    在这里插入图片描述
    在顶部选择控制点选项,双击刚刚转的控制点,进行控制点坐标设置。

    在这里插入图片描述

    在这里插入图片描述

    4.5 网平差

    选择『网平差』->【报告设置】,进入【平差报告设置】窗口,按需设置

    在这里插入图片描述

    选择『网平差』->【平差设置】,进入【平差设置】窗口:

    在这里插入图片描述
    执行菜单『网平差』下的【平差】,软件会弹出平差工具。选择约束平差

    在这里插入图片描述

    点击【全自动平差】,软件将自动根据起算条件,完成自由网平差,WGS84坐标下的约束平差,以及当地三维约束平差和二维约束平差。并形成平差结果列表。选择WGS84三维约束平差,点击【生成报告】,即可查看报告。

    在这里插入图片描述
    完成平差。

    4.6 目标坐标系坐标

    在这里插入图片描述


    相关连接

    HGO产品使用说明书6.0版 提取码:pdx6

    A12 GNSS RTK 系统使用说明书 提取码:pdx6

    中海达官方下载中心

    GPS测量与数据处理[M],武汉大学出版社

    展开全文
  • 数据中台(七) 数据中台架构

    千次阅读 多人点赞 2020-09-23 12:59:15
    数据汇聚是把数据资源通过实时、批量的方式存储到数据中台。基本是按照数据的原始状态堆砌在一起的,是企业对过往所有IT信息化建设积累的成果的融合。 数据开发 数据开发是数据资产内容建设的主战场,是数据价值...
  • 静态数据与非静态数据的区别

    千次阅读 2017-11-14 15:10:14
    静态静态
  • 编译时分析(或称静态分析)得到若干信息后,编译器可以确定在何处应用何种变换是安全并且有利可图的。而其中一种重要的分析技术就是数据流分析。顾名思义,数据流分析就是分析数据如何在程序执行路径上流动的技术,...
  • 定义一个类Student,要求使用静态数据成员或静态成员函数计算5个学生的《计算机导论》课程的总成绩和平均成绩。请同学们自行设计该类。 【提示】 静态数据成员:static int total; 表示所有同学成绩总分 静态成员...
  • C++类的成员变量有以下几种特殊的类型: 1、常成员变量 2、静态成员变量 3、静态常成员变量(基本数据类型) 4、静态常成员变量(自定义数据类型) 二、常成员变量 C++使用const关键字修饰的成员变量...
  • C++类静态数据成员的初始化

    千次阅读 2016-05-16 14:49:24
    每个类只有一个存储单元,静态数据成员为该类的所有对象共有,不属于某个对象。静态数据成员的初始化必须在类以外进行定义性说明。 形式为: :: =值 静态成员注意以下几点: 1、静态成员必须初始化,如果其...
  • fb块中静态变量

    千次阅读 2020-12-31 09:05:34
    在STEP7有两种用来定义符号地址的表格形式:符号表(共享符号)和变量声明表(局域符号),其本质都是为了建立绝对地址与符号地址之间的内在联系,但表格针对的对象不同。共享符号是整个程序所使用的共同符号(用于全局...
  • 一、静态文件抓取(响应文件存在的数据) 二、动态文件抓取(响应文件不存在的数据) 三、多线程数据抓取 四、存文件:多线程争抢共同文件时的操作 五、Python爬虫解析模块思路 一、静态文件抓取(响应文件...
  • 设计包含静态数据成员的Student类

    千次阅读 2018-10-19 11:27:31
    设计包含静态数据成员的Student类,在该类定义包括: 数据成员:学号,年龄,分数score,及静态数据成员学生人数count; 定义成员函数用于设置和读取及显示学号,年龄,分数,累计学生人数;静态成员函数...
  •  类的数据成员声明前加上static,则表示该数据成员为静态数据成员。除了与其他数据具有相同的public/private/protect访问属性外,还有一些其他的属性:  1、不能在类进行初始化,只能在类外。  因为静态数据...
  • 一般情况下,如果有n个同类的对象,那么每一个对象都分别有自己的数据成员,不同对象的数据成员各自有值,互不相干。但是有时人们希望有某一个或几个数据成员为所有对象所共有,这样可以实现数据共享。   可以使用...
  • 很多人可能用过Vie.js,网页动态加载数据。一般来说,HTML在后面调用new Vue()加载数据的。...我尝试使用$Ajax()加载数据,并把数据显示到网页。 我参考Vue编辑网页文件(HTML){。 &lt;tr&gt; &...
  • 现代数据环境下,如何做数据集成?这11个靠谱实践收藏了
  • 静态数据成员定义

    千次阅读 2017-09-11 09:13:52
    我们知道C++类的静态成员变量是需要初始化的,但为什么要初始化呢。其实这句话“静态成员变量是需要初始化的”是有一定问题的,应该说“静态成员变量需要定义”才是准确的,...静态成员变量在类仅仅是声明,没有
  • C++静态成员函数和静态数据成员

    千次阅读 2014-08-05 22:47:10
    各个对象都拥有类每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关。静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关。  静态数据成员的用途之一是...
  • 数据结构分类 结构化数据:具有域名与域值,可用二维表表示。例如关系数据库和CSV文档 半结构数据:具有域值和域名,但每一笔数据的字段可能不一样。例如JSON以及XML 非结构化数据:不具有域值和域名,例如文章,...
  • 定义字符型静态数据成员ServerName,保存其服务器名称;整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeServerName()改变服务器名称。 #include using namespace std; class Client { ...
  • 静态链表

    万次阅读 2020-06-11 13:35:05
    静态链表是顺序表和链表的结合,在初始化时申请一定大小的空间(可以等同于定义一定长度的数组),数组的元素是一个结构体变量,结构体内有两个元素,一是数据,二是游标(相当于链表的指针),游标保存的是下一个...
  • 数据安全治理方法导论

    千次阅读 多人点赞 2020-11-25 22:30:38
    数据安全-The eye of storm】 目录 第一章 数据安全治理是一套系统工程 1.1 数据安全成为安全的核心问题 1.2 数据泄露路径多元化 1.3 数据安全按相关法律和标准大爆发 1.4 数据安全建设需要有系统化...
  • 两个静态数据成员total(总分)和count(学生人数)。成员函数scoretotalcount(float s)用于设置每个学生的分数;静态成员函数sum()用于返回总分;静态成员函数average()用于求分数平均值。在main函数,输入...
  • java的五种引用数据类型(对象类型)

    万次阅读 多人点赞 2019-01-20 14:38:23
    Java有 5种引用类型(对象类型):类 接口 数组 枚举 标注 引用类型:底层结构和基本类型差别较大 ...(3).Code 代码区 :类的定义,静态资源 Student.class Student stu = new Student(); //new ...
  •  在VS测试发现,字符常量区(只读数据区)在编译时候与静态数据区放在了一起。因此在静态数据区的几种类型没有独立的地址区域,都是按照定义的时间顺序进行分配。而动态内存区不同,堆和栈有独立的地址区域,具体...
  • 静态图片只有空间信息,没有时间信息,信息量不够多,所以来做行为识别是有难度的,现有的研究成果比较少,可用的数据集不多,我现在也在做静态图像行为识别方面的研究,多数论文使用的数据集主要有以下几个。...
  • vue动态改变对象或是数组数据,保证页面也是跟着随时改变的,现有三种方法实现: 1、改变引用 data:{ obj:{ name:'gou', age:18 } }, 直接更换变量引用 obj = { name:'gou', age:18, address:'beijin' } ...
  • 1.static变量有什么作用呢? 在函数体内,值维持不变,具有“记忆”功能; ...2.在C++,类内数据成员声明前加上static就变成了静态数据成员#include int main() { printf("hello, world!\n")

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 607,815
精华内容 243,126
关键字:

以下数据中属于静态数据的是