C++对象数组能否被拷贝构造函数初始化

定义一个关于学生信息的类

class Student
{private:
    char *name;
    char id[3];
    int age;
    string ad;
public:

    Student(char *name="XiaoMing" , char *id = "02", int age = 20, string d = "Hunan");
    Student(const Student &other);
    ~Student();
    void name_change();
    void id_change();
    void age_change();
    void ad_change();
    void input();

    char* getid();
    void display();

};

然后写了一个该类的对象数组

Student stu[N];

有什么方法能够初始化该对象?除普通构造函数外拷贝构造函数可以吗?

c++

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++对象数组能否被拷贝构造函数初始化
定义一个关于学生信息的类 ``` class Student {private: char *name; char id[3]; int age; string ad; public: Student(char *name="XiaoMing" , char *id = "02", int age = 20, string d = "Hunan"); Student(const Student &other); ~Student(); void name_change(); void id_change(); void age_change(); void ad_change(); void input(); char* getid(); void display(); }; ``` 然后写了一个该类的对象数组 ``` Student stu[N]; ``` 有什么方法能够初始化该对象?除普通构造函数外拷贝构造函数可以吗?
C++显式调用构造函数初始化对象有用到拷贝构造函数么?
作者:大漠刀客 链接:https://www.nowcoder.com/discuss/29421 来源:牛客网 下面代码中的HasPtr hp4 = HasPtr(1,str); 这里有用到拷贝构造函数,拷贝构造函数中的语句“调用拷贝构造函数” 并没有输出。 但是将拷贝构造函数中的const去掉变成HasPtr(  HasPtr& hp)又报错了, 拷贝构造函数中的第一个参数必须是引用类型,但未必是const吧? 而且从正确使用时的输出看,这里拷贝构造函数HasPtr( const HasPtr& hp)并没有调用啊 ``` #include <iostream> #include <memory> using std::string; using std::cout; using std::endl; class HasPtr{ public: HasPtr() = default; HasPtr( int i1,string &str ){ i = i1; ps = &str; } HasPtr( const HasPtr& hp){ i = hp.i; ps = new string( *hp.ps ); cout<<"调用拷贝构造函数"<<endl; } int i; string *ps; }; int main( ){ string str = "hello"; HasPtr hp4 = HasPtr(1,str); cout<<hp4.i<<" "<<hp4.ps<<endl; return 0; } ```
编译器合成默认拷贝构造函数问题
看《深度探索C++对象模型》遇到的问题。 P49里的例子对于bitwise copy semantics展现了memberwise的拷贝,但是后面P50下面说bitwise copy semantics不需要合成拷贝构造函数。 在P52页的两个例子中,第一个说没合成,我的理解也就是没有初始化int和char\*,但之后的第二个合成了拷贝构造函数,不仅初始化了string,更初始化了int. 我又用vs测试了下,发现可以运行 ``` C++ class B { public: int cc = 10; }; int main() { B b; cout << b.cc << endl; B c = b; cout << c.cc << endl; } ```
c++ 派生类 拷贝构造函数 调用基类的构造函数
在进入派生类(derived)的拷贝构造函数之前,就已经调用了基类(based)的构造函数, 无论你有没有显示的调用。 一般派生类是这种形式: derived(const derived & d):based(d) {} 为什么使用下列形式不行 derived(const derived & d) { based::based(d); } 即在派生类构造函数内部调用基类构造函数。调试的时候发现无法访问基类的私有成员。 为什么使用初始化列表就可以访问基类的私有成员
为什么拷贝构造函数的参数类型不是引用 就会变成死循环的递归
实在不理解这个递归的过程 01.#include<iostream> 02.using namespace std; 03. 04.class CExample 05.{ 06.private: 07. int m_nTest; 08. 09.public: 10. CExample(int x) : m_nTest(x) //带参数构造函数 11. { 12. cout << "constructor with argument"<<endl; 13. } 14. 15. // 拷贝构造函数,参数中的const不是严格必须的,但引用符号是必须的 16. CExample(const CExample & ex) //拷贝构造函数 17. { 18. m_nTest = ex.m_nTest; 19. cout << "copy constructor"<<endl; 20. } 21. 22. CExample& operator = (const CExample &ex) //赋值函数(赋值运算符重载) 23. { 24. cout << "assignment operator"<<endl; 25. m_nTest = ex.m_nTest; 26. return *this; 27. } 28. 29. void myTestFunc(CExample ex) 30. { 31. } 32.}; 33. 34.int main(void) 35.{ 36. CExample aaa(2); 37. CExample bbb(3); 38. bbb = aaa; 39. CExample ccc = aaa; 40. bbb.myTestFunc(aaa); 41. 42. return 0; 43.} 输出结果: 01.constructor with argument // CExample aaa(2); 02.constructor with argument // CExample bbb(3); 03.assignment operator // bbb = aaa; 04.copy constructor // CExample ccc = aaa; 05.copy constructor // bbb.myTestFunc(aaa); ------------------------------------------------------------------ 第四个输出: copy constructor // CExample ccc = aaa 构造ccc的时候只调用一次复制构造函数从aaa那里构造出新对象了 但是放到复制构造函数参数里面如果不是引用而是用aaa传值的话 就会像下面说的 ----------------------------- 构造ccc,实质上是ccc.CExample(aaa); 我们假如拷贝构造函数参数不是引用类型的话, 那么将使得 ccc.CExample(aaa)变成aaa传值给ccc.CExample(CExample ex),即CExample ex = aaa,因为 ex 没有被初始化, 所以 CExample ex = aaa 继续调用拷贝构造函数,接下来的是构造ex,也就是 ex.CExample(aaa),必然又会有aaa传给CExample(CExample ex), 即 CExample ex = aaa;那么又会触发拷贝构造函数,就这下永远的递归下去。 ------------------------------ 这是我百度的结果很多都是这样说的但是还是理解不了 为什么2个 CExample ccc = aaa 差不多 一个是放在函数内 就无法构造对象了?而是形成递归?
关于c++中默认拷贝构造函数的理解
如题,请解释一次详细的原理 假如我定义一个类的对象a,然后在没有自己编写构造函数的情况下用语句A b=a来初始化新的对象b,会发生什么,为什么?
C++数组作为类的私有成员求助
定义一个Employee类,其中包括姓名、街道地址、城市和邮编等属性,以及changeName()和display()等函数。display()显示姓名、街道地址、城市和邮编等属性,changeName()改变对象的姓名属性。 在employee.h文件中定义Employee类。Employee类具有姓名、街道地址、城市和邮编等私有数据成员,都可以用字符型数组来表示,在成员函数中,构造函数用来初始化所有成员数组,对字符数组的赋值可以使用字符串拷贝函数strcpy(char *, char *);display()中使用cout显示姓名、街道地址、城市和邮编等属性,changeName()改变类中表示姓名属性的字符数组类型的数据成员。在主程序中定义这个类的对象并对其进行操作。 请问下构造函数如果设置了形参那要怎么实现?还有就是strcpy()函数要怎么使用啊...QAQ跪求大神指点
c++定义了一个动态数组但是报错???
总是提示访问路径出现冲突 研究了半天才知道是 数组的问题 请看到的大神 帮帮忙 谢谢 (vs平台上的) ![图片说明](https://img-ask.csdn.net/upload/201903/11/1552295783_772317.png) 代码在下面 这是头文件部分 ``` #include<iostream> using namespace std; class Array { private://私有数据成员: int *a;// 指向根据len动态申请的数组空间 int len;// 有效数组元素的个数 public://公有成员函数 : Array(int b[], int length);// 构造函数, 使用数组b初始化a所指的动态数组, length初始化len Array(const Array &arr);// 拷贝构造函数,使用对象arr初始化新对象 void sort();// 按题意对动态数组中的元素进行排序 void print();// 输出a所指向的数组 ~Array();// 析构函数, 释放动态数组空间 }; ``` 这是成员函数部分 ``` #include"array.h" using namespace std; Array::Array(int b[], int length)// 构造函数, 使用数组b初始化a所指的动态数组, length初始化len { int i; int *a = new int[length]; len = length; for (i = 0; i<len; i++) { a[i]= b[i]; } } Array::Array(const Array &arr)// 拷贝构造函数,使用对象arr初始化新对象 { int i; len = arr.len; int *a=new int[len]; for (i = 0; i < len; i++) { a[i] = arr.a[i]; } } void Array::sort()// 按题意对动态数组中的元素进行排序 { int i,j; int temp; for(i=0;i<len;i++) { for(j=i+1;j<len;j++) { if(a[i]<a[j]) { temp = a[i]; a[i] = a[j]; a[j] = temp; } } } } void Array::print()// 输出a所指向的数组 { int i; for(i=0;i<len;i++) { cout<<a[i]<<endl; } } Array::~Array()// 析构函数, 释放动态数组空间 { delete []a; } ``` 这是主函数 ``` #include"array.h" using namespace std; int main() { int num; int i; int a[50]; cout<<"输入数组的元素个数"<<endl; cin>>num; for(i=0;i<num;i++) { cin>>a[i]; } Array text(a,num); text.sort(); text.print (); system("pause"); return 0; } ```
c++技术帮,给个程序的思路
编写一个实现n维向量各种操作的类(Vector),功能包括: 1. 构造函数实现n维向量的初始化构造,这里n可变; 2. 析构函数实现向量动态内存的释放; 3. 拷贝构造函数和移动拷贝构造函数实现向量的拷贝构造; 4. 重载赋值运算符('=')和移动赋值运算符,实现两个向量之间的赋值; 5. 编写成员函数求两个向量的内积; 6. 编写成员函数求两个向量的外积; 7. 编写成员函数求两个向量的和; 8. 编写成员函数求两个向量的差; 9. 编写成员函数实现向量单位化; 10. 编写一个主函数测试向量类的上述功能。 在向量类的基础上,编写矩阵类(Matrix),功能包括:实现矩阵的一些常用运算:取一行、子块、求行列式值(detMatrix)、数乘(ScalarMult);还对矩阵运算的操作符进行了重载:+(operator+)、-(operator-)等。并用主函数测试该矩阵类。 Matrix operator[](int); //取某行,对操作符[]重载 Matrix operator()(int, int, int, int); //取子块,对操作符()重载
帮忙看看这个程序出了什么问题
本菜写了一个小程序 能够创建一个矩阵,规定长宽,并进行矩阵之间的加减运算 代码如下 ``` #include<iostream> using namespace std; class matrix //创建矩阵类 { private: int lines; int rows; int **num; //建立二重数组 public: matrix(int a,int b) //构造函数 { lines=a; rows=b; cout<<"矩阵初始化"<<endl; num=new int*[lines]; int x,y; for(y=0;y<lines;y++) { num[y]=new int[rows]; //循环完成new申请内存 } } /*matrix(matrix& father) //拷贝构造函数 { cout<<"调用拷贝构造函数"<<endl; lines=father.lines; rows=father.rows; int x,y; for(y=0;y<lines;y++) { for(x=0;x<rows;x++) { num[x][y]=father.num[x][y]; //循环读入矩阵元素 } } }*/ void in(); //输入函数 void out(); //输出函数 int get_num(int x,int y) //取用指定元素的函数(内联) { return num[x][y]; } void operate(int mode,matrix m1,matrix m2); //运算函数,包含加和减 ~matrix() //析构函数 释放矩阵空间 { } void matrix_free(); //释放矩阵空间函数 }; void matrix::matrix_free() { int i; for(i=0;i<lines;i++) { delete []num[i]; } delete []num; } void matrix::in() { cout<<"请按顺序输入矩阵元素:"<<endl; int x,y; for(y=0;y<lines;y++) { for(x=0;x<rows;x++) { cin>>num[x][y]; //循环输入矩阵元素 } } } void matrix::out() //此函数可以按格式输出矩阵 { int x,y; for(y=0;y<lines;y++) { for(x=0;x<rows;x++) { cout<<num[x][y]; if(x!=rows-1) { cout<<" "; } } cout<<endl; } } void matrix::operate(int mode,matrix m1,matrix m2) //运算函数,mode=1代表加,mode=-1代表减,m1,m2为待处理矩阵 { int x,y; for(y=0;y<lines;y++) { for(x=0;x<rows;x++) { num[x][y]=m1.get_num(x,y)+mode*m2.get_num(x,y); //运算部分 } } } int main(void) { int a=0,b=0; cout<<"输入矩阵大小(行 列):"<<endl; while(a<=0||b<=0) { cin>>a>>b; if(a<=0||b<=0) { cout<<"输入错误,重新输入:"<<endl; } } matrix A1(a,b),A2(a,b),A3(a,b); //创建三个矩阵 A1.in(); //输入初始化 A2.in(); A3.operate(1,A1,A2); //A3=A1+A2 cout<<"矩阵和:"<<endl; A3.out(); //输出 A3.operate(-1,A1,A2); //A3=A1-A2 cout<<"矩阵差:"<<endl; A3.out(); //输出 A1.matrix_free(); //释放矩阵空间 A2.matrix_free(); A3.matrix_free(); } ``` 此程序目前问题有三个 1.拷贝构造函数出错,只能注释掉,否则输入完两个矩阵后回车程序未响应 2.释放矩阵空间的不能写在析构函数里,否则输出结果不正确(A3=A1-A2的最后一行) 3.输入矩阵的列不能大于行,否则输入完第一行数字并回车后程序未响应 请前辈指导,谢谢
C++ primer 里面STL容器set的insert操作问题。。。
在C++primer 5th 的13.4节里面有个类的定义是这样的: class Message { friend void swap(Message&, Message&); friend class Folder; public: //folders被隐式初始化为空集合 explicit Message(const string &str=""):contents(str){} //拷贝控制成员,用来管理指向本Message的指针 Message(const Message&); //拷贝构造函数 Message& operator=(const Message&); //拷贝赋值运算符 ~Message(); //析构函数 //从给定的Folder中添加/删除本Message void save(Folder&); void remove(Folder&); //显示有几个Message对象 void show(); private: string contents; //实际消息文本 set<Folder*> folders; //包含本Message的folder //拷贝构造函数,拷贝赋值运算符合析构函数所使用的工具函数 //将本message添加到指向参数的folder中 void add_to_Folders(const Message&); //从folders中的每个Folder中删除本Message void remove_from_Folders(); //向folders添加和删除 void addFldr(Folder *f){folders.insert(f);} void remFldr(Folder *f){folders.erase(f);} }; 其中的成员函数 void save(Folder&);定义为: void Message::save(Folder &f) { folders.insert(&f); //将给定Folder添加到我们的Folder列表中 f.addMsg(this); //将本Message添加到f的Message中 } 请教下大神,folders不是set< Folder的指针> 类型么,为什么在函数里面folders可以insert像Folder& 的类型(不是应该insert像 Folder的指针的类型)?
C++初学者上机的一个实验题,不出结果,大神们指教一下(VC++6.0编译器)
/*依据下面的描述定义并实现一个向量类Vector,并在main函数中定义所需要的对象验证所实现代码的正确性 1) 私有数据成员int dimension; double* data; 表示向量的维数与向量元素存储空间的首地址 2) 无参构造函数,实现把向量所有元素初始化为0 3) 有参构造函数,实现用一个n维数组初始化n维向量 4) 拷贝构造函数 5) 析构函数 6) 输出数据成员函数 void display( ); 7) 成员函数int GetDimension();获取向量对象的维数 8) 成员函数 double SetAt(double newdata,int index);实现给向量的第index+1个元素赋值 9) 成员函数 double GetAt(int index);实现读取向量的第index+1个元素的值 10)实现向量加、减、乘运算的成员函数 Vector Add(const Vector &ob2 ); Vector Sub(const Vector &ob2 ); int Mult(const Vector &ob2 ); */ #include <iostream.h> class Vector { private: int dimension; double* data; public: Vector(); Vector(int a[]); Vector(const Vector &v); ~Vector(); void Display(); int GetDimension(); double SetAt(double newdata,int index); double GetAt(int index); Vector Add(const Vector &ob2 ); Vector Sub(const Vector &ob2 ); int Mult(const Vector &ob2 ); }; Vector::Vector()//无参构造函数,实现把向量所有元素初始化为0 { dimension=4; for(int i=0;i<4;i++) data[i]=0; } Vector::Vector(int a[])//有参构造函数,实现用一个n维数组初始化n维向量 { dimension=sizeof(a); int i; for(i=0;i<dimension;i++) data[i]=a[i]; } Vector::Vector(const Vector &v)//拷贝构造函数 { dimension=v.dimension; for(int i=0;i<v.dimension;i++) data[i]=v.data[i]; } Vector::~Vector()//析构函数 {} void Vector::Display()//输出数据成员函数 { cout<<'('; for(int i=0;i<dimension;i++) cout<<data[i]<<','; cout<<')'; } int Vector::GetDimension()//获取向量对象的维数 { return sizeof(data); } double Vector::SetAt(double newdata,int index)//实现给向量的第index+1个元素赋值 { data[index]=newdata; return 0; } double Vector::GetAt(int index)//实现读取向量的第index+1个元素的值 { return data[index]; } Vector Vector::Add(const Vector &ob2)//实现向量加、减、乘运算的成员函数 { Vector temp; temp.dimension=dimension; for(int i;i<dimension;i++) temp.data[i]=data[i]+ob2.data[i]; return temp; } Vector Vector::Sub(const Vector &ob2) { Vector temp; temp.dimension=dimension; for(int i;i<dimension;i++) temp.data[i]=data[i]-ob2.data[i]; return temp; } int Vector::Mult(const Vector &ob2) { int i; double sum=0; for(i=0;i<dimension;i++) sum+=data[i]*ob2.data[i]; return int(sum); } int main() { Vector v1; double data=0; int a[4]={1,2,3,4}; Vector v2(a); Vector v3(v2); Vector v4,v5; cout<<"lv1:"<<v1.GetDimension()<<endl; v1.Display(); cout<<"lv2:"<<v2.GetDimension()<<endl; v2.Display(); cout<<"lv3:"<<v3.GetDimension()<<endl; v3.Display(); v1.SetAt(3,2); v1.Display(); cout<<v1.GetAt(2)<<endl; v1.Display(); v4=v1.Add(v2); cout<<"v1+v2="<<endl; v4.Display(); v5=v1.Sub(v2); cout<<"v1-v2="<<endl; v5.Display(); int sum; sum=v1.Mult(v2); cout<<"v1*v2="<<sum; return 0; }
C++中的debug error问题 困扰我两天了 大神快来
#include<iostream> #ifndef STRINGBAD_H_ #define STRINGBAD_H_ class StringBad { private: char * str; int len; static int num_strings; //不能在类声明中初始静态成员变量 这是因为声明描述如何分配内存 但并不分配内存 public: StringBad(const StringBad & st); //复制构造函数 StringBad(const char * s); //显示构造函数 StringBad(); //默认构造函数 ~StringBad(); //析构函数 friend std::ostream & operator<<(std::ostream & os, const StringBad & st); //友元函数 重载<<运算符 StringBad & operator=(const StringBad & st); //重载赋值运算符 }; #endif #include<string.h> #include"stringbad.h" using std::cout; using std::endl; int StringBad::num_strings = 0; //初始化类静态成员 静态类成员可以在类声明之外只用单独语句进行初始化 StringBad::StringBad(const StringBad & st) //赋值构造函数 进行深度复制 { num_strings++; //更新静态成员 const int b=len = st.len; //复制私有整型成员 str = new char[len + 1]; //把指针指向创建的新地址 strcpy_s(str, strlen(st.str)+1, st.str); //然后将字符串副本复制到新地址 cout << num_strings << ": \"" << str << "\" object created\n"; cout << &str << endl; } //浅复制导致的结果是把指针(指向同一内存字符串的地址)复制过去 当析构函数调用的时候将释放同一字符串 引起非常严重的后果 //所以 可能会被析构两次 应当使用上述的深度复制 而不是系统默认的 StringBad::StringBad(const char * s) { len = std::strlen(s); //检测计算字符串长度 但不包括末尾的空字符 并对len成员进行初始化 str = new char[len + 1]; //创建动态类成员 使用new分配足够的空间保存字符串 然后将新地址赋给str成员 strcpy_s(str, strlen(s) + 1, s); //复制字符串 将第二个字符串拷贝到第一个字符串的位置 num_strings++; cout << num_strings << ": \"" << str << "\" object created\n"; cout << &str << endl; } StringBad::StringBad() { len = 4; str = new char[4]; strcpy_s(str, 4, "C++"); num_strings++; cout << num_strings << ": \"" << str << "\" default object created\n"; cout << &str << endl; } StringBad::~StringBad() { cout << "\"" << str << "\" object deleted, "; --num_strings; cout << num_strings << " left\n"; delete[]str; cout << str << endl; } std::ostream & operator<<(std::ostream & os, const StringBad & st) { os << st.str; return os; } StringBad & StringBad::operator=(const StringBad & st) { if (this == &st) //检测是否自我复制 return *this; //是的话返回并结束 delete[]str; //否则释放str 释放目前占用的内存 因为 指针会等系会指向新内存 所以这段会被浪费掉 len = st.len; //赋值私有成员 无影响 str = new char[len + 1]; //创建新内存 并把新内存地址赋给指针str 因为之前的指向的旧地址已经被释放了 所以节省了内存 strcpy_s(str, strlen(st.str) + 1, st.str); //赋值字符串到新内存当中 return *this; //并返回对象 } #include<iostream> using std::cout; #include"stringbad.h" void callme1(StringBad &); void callme2(StringBad); int main() { using std::endl; { cout << "Starting an inner block.\n"; // StringBad headline1("Celery Stalks at Midnight"); // StringBad headline2("Lettuce Prey"); StringBad sports("Spinach Leaves Bowl for Dollars"); cout << "headline1: " << headline1 << endl; cout << "headline2: " << headline2 << endl; cout << "sports: " << sports << endl; callme1(headline1); cout << "headline1: " << headline1 << endl; callme2(headline2); cout << "headline2: " << headline2 << endl; cout << "Initialize one object to another:\n"; StringBad sailor = sports; cout << "sailor: " << sailor << endl; cout << "Assign one object to another:\n"; StringBad knot; knot = headline1; cout << "knot: " << knot << endl; cout << "Exiting the block.\n"; } cout << "End of main()\n"; return 0; } void callme1(StringBad & rsb) { cout << "String passed by reference:\n"; cout << " \"" << rsb << "\"\n"; } void callme2(StringBad sb) { cout << "String passwd by value:\n"; cout << " \"" << sb << "\"\n"; }![图片说明](https://img-ask.csdn.net/upload/201709/27/1506521094_491397.png)
这段代码有两三个错误 代码是基础的c++ 运行环境为CB或者devc++麻烦帮我改一下~
#include<iostream> #include <string> #include <memory.h> using namespace std; class Set { int maxsize;//集合的当前最大容量 int count;//集合的当前元素个数 int *elem; public: //Set(int initsize=10);//构造函数,创建一个空集,initsize: 集合的初始容量 Set(const Set &s);//拷贝构造函数 Set();//析构函数 int Add(int a[], int len);//增加一组新元素,返回值为新增加的元素个数 int Add(int e);//增加一个新元素,返回值为新增加的元素个数 bool Contains(int e) const;//检查当前集合中是否已包含元素 e Set Intersect(const Set& s) const;//求与另一集合的交集 Set Union(const Set& s) const;//求与另一集合的并集 int GetCount() const;//获取当前集合中的元素个数 void Print() const;};//打印所有元素 };//注:const 表示该函数不会对当前对象的数据成员做出修改 int main() { int a[]={1,3,5,7,9}, b[]={2,4,6,8,10,3, 5}; Set s1, s2; s1.Add(a, 5); s2.Add(b, 7); Set s3 = s1.Intersect(s2); Set s4 = s1.Union(s2); s3.Print(); s4.Print(); } void Set::Print()const { for (int i = 0; i < count; i++) cout << elem[i] << " "; cout << endl; } Set Set::Union(const Set& s) const { Set r(s); //用 s 来初始化新集合 r.Add(elem, count); //再添加入当前集合中包含的内容 return r; } inline int Set::GetCount() const { return count; } Set Set::Intersect(const Set& s) const { //int Set::count; Set r(s.count + this->count); for (int i = 0; i < s.count; i++) { if (Contains(s.elem[i])) r.Add(s.elem[i]); //两个集合中都有的元素,加入到交集中。 } return r; } Set::Set(const Set& s) { maxsize = s.maxsize; count = s.count; elem = new int[maxsize]; //为新元素分配空间 memcpy(elem, s.elem, sizeof(int)*count); //复制所有元素 } Set::Set() { delete[] elem; //释放占用空间 } Set::Set(int initsize) :maxsize(initsize), count(0) { elem = new int [maxsize]; if (!elem) throw "申请集合空间失败!"; } int Set::Add(int a[], int len) { int c = 0; //用于记录新增加的元素个数 for (int i = 0; i < len; i++) c+= Add(a[i]); return c; } int Set::Add(int e) { if (Contains(e)) return 0; //当前集合中已包含了指定元素,不用添加了。 if (count == maxsize) //空间已满,再增加空间 { int *tmp = new int[maxsize+10]; if (!tmp) return 0; //申请新空间失败,退出 memcpy(tmp, elem, count*sizeof(int)); //将原来的内容复制到新空间中 maxsize += 10; //最大容量增长10个数据单位 delete[] elem; //删除原有空间 elem = tmp; } elem[count++] = e; //将新元素存放在数组的最后 return 1; } bool Set::Contains(int e) const { for (int i = 0; i < count; i++) if (elem[i] == e) return true; return false;}
Creat函数为什么会错呢?
循环链表ADT模板简单应用算法设计:约瑟夫环 作者: 冯向阳时间限制: 1S章节: DS:线性表 问题描述 : 目的:使用C++模板设计循环链表的抽象数据类型(ADT)。并在此基础上,使用循环链表ADT的基本操作,设计并实现单链表的简单算法设计。 内容:(1)请使用模板设计循环链表的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考网盘中的单链表ADT原型文件,自行设计循环链表的ADT。) (2)ADT的简单应用:使用该ADT设计并实现循环链表应用场合的一些简单算法设计。 应用2:编号为1,2,...,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。现在给定一个随机数m>0,从编号为1的人开始,按顺时针方向1开始顺序报数,报到m时停止。报m的人出圈,同时留下他的密码作为新的m值,从他在顺时针方向上的下一个人开始,重新从1开始报数,如此下去,直至所有的人全部出列为止。请在使用循环链表ADT的基础上,设计一个算法求出圈的顺序(以编号表示)。限定人数至少为1. 参考函数原型: template<class ElemType> void Joseph(CirLinkList<ElemType> &A, int m); //约瑟夫环专用结点类型 struct node{ int number; int code; }; 输入说明 : 第一行:人数n 第二行:第一个人所持的密码 第三行:第二个人所持的密码 ... 第n+1行:第n个人所持的密码 第n+2行:给定的随机数m 输出说明 : 第一行至第n行:建立的循环链表的遍历结果(一个结点占据1行) 第n+1行:空行 第n+2行:出圈的顺序(编号与编号之间以“->”分隔) #include <iostream> #include<stdio.h> #include<stdlib.h> using namespace std; /* 循环单链表的结点定义 */ template<class ElemType> struct LinkNode { ElemType data; int node; LinkNode<ElemType> *next; //构造函数1,用于构造头结点 LinkNode(LinkNode<ElemType> *ptr = NULL) { next = ptr; } //构造函数2,用于构造其他结点 //函数参数表中的形参允许有默认值,但是带默认值的参数需要放后面 LinkNode(const ElemType &item,const ElemType &itam, LinkNode<ElemType> *ptr = NULL) { next = ptr; data = item; node=itam; } //取得结点的数据域的值 ElemType getData(){ return data; } //修改结点的next域 void SetLink( LinkNode<ElemType> *link ){ next = link; } //修改结点的data域 void SetLink( ElemType value ){ data = value; } }; //带头结点的循环单链表 template<class ElemType> class CirLinkList { private: LinkNode<ElemType> *head; // 头结点 LinkNode<ElemType> *tail; // 尾结点 public: //无参数的构造函数 CirLinkList(){head = new LinkNode<ElemType>; tail = head; head->next = head;} //带参数的构造函数 CirLinkList(const ElemType &item){head = new LinkNode<ElemType>(item); tail = head; head->next = head;} //拷贝构造函数 CirLinkList(CirLinkList<ElemType> &List); //析构函数 //~CirLinkList(){ListDestroy();} //销毁链表 void ListDestroy(); //清空链表 void ListClear(); //返回链表的长度 int ListLength() { if(head->next==head) return 0; else {LinkNode<ElemType> *p; int i=1; p=head->next; while(p->next!=head->next) { p=p->next; i++; } return i;} } //判断链表是否为空表 bool ListEmpty() { if(head->next==head) return true; else return false; } //获取循环链表头结点 LinkNode<ElemType>* GetHead() { return head;} //获取循环链表尾结点 LinkNode<ElemType>* GetTail() { return tail;} //设置链表头结点 void SetHead(LinkNode<ElemType> *p){ head = p;} //在链表的第pos个位置之后插入e元素 void ListInsert_next(int pos,ElemType e) { int j; LinkNode<ElemType> *p,*s,*r; s=(LinkNode<ElemType>*)malloc(sizeof(ElemType)); p=head->next; j=1; while(j<pos&&p) { p=p->next; j++; } r=p; s->data=e; p->next=s; s->next=r->next; } //表头插入法动态生成链表 void CreateList_Head(int n) { ElemType w; LinkNode <ElemType> *h; LinkNode <ElemType> *o; h=head; for(int i=n;i>0;i--) { o=(LinkNode<ElemType>*)malloc(sizeof(ElemType)); cin>>w; o->data=w; o->node=n-i+1; h->next=o; tail=o; tail->next=head->next; h=tail; } } //表尾插入法动态生成链表 //void CreateList_Tail(int n, ElemType *A); //遍历链表 void ListTraverse() { LinkNode<ElemType> *p=head->next; while(p->next!=head->next) { cout<<p->node<<" "<<p->data<<endl; p=p->next; } cout<<p->node<<" "<<p->data<<endl; cout<<endl; return ; } void Joseph(int m,int cd) { int j=1,i; LinkNode<ElemType> *p,*s; p=head->next; s=p; for(i=1;i<cd;i++) { while(j!=m) { s=p; p=p->next; j++;} s->next=p->next; m=p->data; cout<<p->node<<"->"; p=s->next; j=1; } cout<<p->node; cout<<endl; } }; int main() { CirLinkList<int> d; int cd; cin>>cd; d.CreateList_Head(cd); int m; cin>>m; d.ListTraverse(); d.Joseph(m,cd); return 0; } 所设链表为带头指针的循环链表 即头指针指向第一个元素,尾指针也指向第一个元素 但在初始化时 头指针和尾指针相等。
代码运行有问题怎么解决
#include <iostream> #include <string> #include <queue> #include <map> using namespace std; /** * @brief 哈弗曼结点 * 记录了哈弗曼树结点的数据、权重及左右儿子 */ struct HTNode { char data; HTNode *lc, *rc; int w; /** 节点构造函数 */ HTNode(char _d, int _w, HTNode *_l = NULL, HTNode *_r = NULL) { data = _d; w = _w; lc = _l; rc = _r; } /** 节点拷贝构造函数 */ HTNode(const HTNode &h) { data = h.data; lc = h.lc; rc = h.rc; w = h.w; } /** 用于优先队列比较的运算符重载 */ friend bool operator < (const HTNode &a, const HTNode &b) { return a.w > b.w; } }; /** 哈弗曼树叶子节点数、各叶子结点数据及权重 */ /** 权值从Lolita小说中抽样取出 */ const char ch[] = { 10, 32, 33, 37, 40, 41, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 63, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 93, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 161, 164, 166, 168, 170, 173, 174, 175, 176, 177, 180, 186, 255, '\r', '\0' }; const int fnum[] = { 2970, 99537, 265, 1, 496, 494, 9032, 1185, 5064, 108, 180, 132, 99, 105, 82, 64, 62, 77, 126, 296, 556, 548, 818, 443, 543, 435, 225, 271, 260, 797, 3487, 158, 50, 1053, 589, 498, 332, 316, 61, 276, 724, 855, 54, 293, 543, 11, 185, 11, 25, 26, 42416, 7856, 12699, 23670, 61127, 10229, 10651, 27912, 32809, 510, 4475, 23812, 13993, 34096, 38387, 9619, 500, 30592, 30504, 42377, 14571, 4790, 11114, 769, 10394, 611, 1, 4397, 12, 71, 117, 1234, 81, 5, 852, 1116, 1109, 1, 3, 1, 2970 }; const int n = 91; /** 优先队列 */ priority_queue<HTNode> pq; /** 哈弗曼编码映射 */ map<string, char> dcode; map<char, string> ecode; /** 根节点以及总权重+边长 */ HTNode *root; int sum = 0; /** 初始化叶节点,并加入到优先队列中 */ void Init() { for(int i = 0; i < n; i++) { HTNode p(ch[i], fnum[i]); pq.push(p); } } /** 建立哈夫曼树 */ void CreateHT() { HTNode *lmin, *rmin; /** 当队列中不止一个元素时 */ while(!pq.empty() && 1 != pq.size()) { /** 取队首两个元素(权值最小) */ lmin = new HTNode(pq.top()); pq.pop(); rmin = new HTNode(pq.top()); pq.pop(); /** 合并元素重新入队 */ HTNode p(0, lmin->w + rmin->w, lmin, rmin); pq.push(p); } if(!pq.empty()) { /** 根节点 */ root = new HTNode(pq.top()); pq.pop(); } } /** 创建哈夫曼编码 */ void CreateHTCode(HTNode *p, string str) { if(!p) return; if(0 != p->data) { /** 若是叶节点,则记录此节点的编码值 */ dcode[str] = p->data; ecode[p->data] = str; sum += (str.length() * p->w); return; } CreateHTCode(p->lc, str + "0"); CreateHTCode(p->rc, str + "1"); } /** 显示哈夫曼编码 */ void DispCode() { printf("输出哈弗曼编码:\n"); for(int i = 0; i < n; i++) { printf("\t'%c':\t%s\n", ch[i], ecode[ch[i]].c_str()); } printf("平均长度:%.5lf\n", double(sum) / double(root->w)); } /** 释放哈夫曼树 */ void Release(HTNode *p) { if(!p) return; Release(p->lc); Release(p->rc); delete p; } /** 输出压缩文 */ void putEncode(FILE *fp, char *buf) { unsigned char code = 0; for(int i = 0; i < 8; i++) code = (code << 1) + (buf[i] - '0'); fwrite(&code, sizeof(unsigned char), 1, fp); } /** 判断是否在字符串内 */ bool instr(char c, const char str[]) { for(int i = 0; i < strlen(str); i++) if(c == str[i]) return true; return false; } /** 压缩文件 */ void Encode() { FILE *OF; FILE *IF; char ifn[255]; const char ofn[] = "Encode.txt"; char buf[9]; int cnt = 0, newcnt = 0; printf("Input the filename: "); scanf("%s", ifn); IF = fopen(ifn, "rb"); if(!IF) { printf("Wrong file.\n"); return; } OF = fopen(ofn, "wb+"); if(!OF) { printf("Wrong file.\n"); } /** 开始读文件 */ memset(buf, 0, sizeof(buf)); while(!feof(IF)) { unsigned char c; fread(&c, sizeof(unsigned char), 1, IF); if(instr(c, ch)); else c = ' '; for(int i = 0; i < ecode[c].length(); i++) { buf[strlen(buf)] = ecode[c][i]; if(8 == strlen(buf)) { newcnt++; putEncode(OF, buf); memset(buf, 0, sizeof(buf)); } } cnt++; } cnt--; if(0 != strlen(buf)) { for(int i = strlen(buf); i < 8; i++) buf[i] = '0'; putEncode(OF, buf); } fwrite(&cnt, 4, 1, OF); fclose(IF); fclose(OF); printf("压缩成功!压缩率:%.2f%c\n", (((double)newcnt + 4.0f) / (double)cnt) * 100, '%'); } /** 补0 */ void putZeros(char *buf) { char tmpbuf[9]; memset(tmpbuf, 0, sizeof(tmpbuf)); if(8 != strlen(buf)) { for(int i = 0; i < 8 - strlen(buf); i++) tmpbuf[i] = '0'; strcat(tmpbuf, buf); strcpy(buf, tmpbuf); } } /** 解压缩 */ void Decode() { char buf[256]; char oldbuf[9]; const char ifn[] = "Encode.txt"; const char ofn[] = "Decode.txt"; FILE *IF = fopen(ifn, "rb"); if(!IF) { printf("Wrong file.\n"); return; } FILE *OF = fopen(ofn, "wb+"); if(!OF) { printf("Wrong file.\n"); return; } int tot, cnt = 0; fseek(IF, -4L, SEEK_END); fread(&tot, 4, 1, IF); fseek(IF, 0L, SEEK_SET); memset(buf, 0, sizeof(buf)); while(true) { if(cnt == tot) break; unsigned char c; fread(&c, sizeof(unsigned char), 1, IF); itoa(c, oldbuf, 2); putZeros(oldbuf); for(int i = 0; i < 8; i++) { if(cnt == tot) break; buf[strlen(buf)] = oldbuf[i]; if(dcode.end() != dcode.find(string(buf))) { fwrite(&dcode[string(buf)], sizeof(char), 1, OF); memset(buf, 0, sizeof(buf)); cnt++; } } } fclose(IF); fclose(OF); printf("解压成功!文件名Decode.txt。\n"); } int main() { Init(); CreateHT(); CreateHTCode(root, ""); DispCode(); Encode(); Decode(); Release(root); system("pause"); return 0; }
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载 点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
JDK12 Collectors.teeing 你真的需要了解一下
前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老规矩,我们先来看个图(这真是一个不和谐的图????): 管道改造经常会用这个小东西,通常我们叫它「三通」,它的主要作用就是将 downstream1 和 downstre...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
GitHub标星近1万:只需5秒音源,这个网络就能实时“克隆”你的声音
作者 | Google团队 译者 | 凯隐 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 本文中,Google 团队提出了一种文本语音合成(text to speech)神经系统,能通过少量样本学习到多个不同说话者(speaker)的语音特征,并合成他们的讲话音频。此外,对于训练时网络没有接触过的说话者,也能在不重新训练的情况下,仅通过未知...
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
【管理系统课程设计】美少女手把手教你后台管理
【文章后台管理系统】URL设计与建模分析+项目源码+运行界面 栏目管理、文章列表、用户管理、角色管理、权限管理模块(文章最后附有源码) 1. 这是一个什么系统? 1.1 学习后台管理系统的原因 随着时代的变迁,现如今各大云服务平台横空出世,市面上有许多如学生信息系统、图书阅读系统、停车场管理系统等的管理系统,而本人家里就有人在用烟草销售系统,直接在网上完成挑选、购买与提交收货点,方便又快捷。 试想,若没有烟草销售系统,本人家人想要购买烟草,还要独自前往药...
4G EPS 第四代移动通信系统
目录 文章目录目录4G 与 LTE/EPCLTE/EPC 的架构E-UTRANE-UTRAN 协议栈eNodeBEPCMMES-GWP-GWHSSLTE/EPC 协议栈概览 4G 与 LTE/EPC 4G,即第四代移动通信系统,提供了 3G 不能满足的无线网络宽带化,主要提供数据(上网)业务。而 LTE(Long Term Evolution,长期演进技术)是电信领域用于手机及数据终端的高速无线通...
日均350000亿接入量,腾讯TubeMQ性能超过Kafka
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】近日,腾讯开源动作不断,相继开源了分布式消息中间件TubeMQ,基于最主流的 OpenJDK8开发的Tencent Kona JDK,分布式HTAP数据库 TBase,企业级容器平台TKEStack,以及高性能图计算框架Plato。短短一周之内,腾讯开源了五大重点项目。其中,TubeMQ是腾讯大数据平台部门应用的核心组件,...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车?某胡同口的煎饼摊一年能卖出多少个煎饼?深圳有多少个产品经理?一辆公交车里能装下多少个乒乓球?一个正常成年人有多少根头发?这类估算问题,被称为费米问题,是以科学家费米命名的。为什么面试会问这种问题呢?这类问题能把两类人清楚地区分出来。一类是具有文科思维的人,擅长赞叹和模糊想象,它主要依靠的是人的第一反应和直觉,比如小孩...
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。 背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法 不过,当我看了源代码之后 这程序不到50行 尽管我有多年的Python经验,但我竟然一时也没有看懂 当然啦,原作者也说了,这个代码也是在无聊中诞生的,平时撸码是不写中文变量名的, 中文...
相关热词 c# 二进制截断字符串 c#实现窗体设计器 c#检测是否为微信 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片
立即提问