vector为什么会全部为空?

使用一个线程不断读取文本数据,然后将读取的数据存入vector,
然后启动另一个线程不断读取vector,将读到的数据发送至屏幕上,发现屏幕上经常
出现空行,调试才发现vector有时候整个都会变为全空,才会显示空行,而下1秒,vector数据就会全部恢复正常。请问这是怎样导致的?
和vector结构有关吗?
图片说明

 typedef struct stTraceInfo
{
    string ID;
    string Component;
    string Date;
    string Time;
    string Subsystem;
    string Operation;
    string Event;
    string str[7];
}TraceInfo, *pstTraceInfo;
vector      <stTraceInfo> g_stvec;

8个回答

当Vector中的元素超过它的初始大小时,Vector会将它的容量翻倍,是不是元素个数过多呢

oqqsoap1234567
alexsendar 可能是吧
接近 3 年之前 回复

会不会是多线程的问题,加个锁?

去掉一个线程先测试一下呗!

显示数据应该在主线程里处理啊!

线程都是在抢时间片干活的,读入的线程没抢的输出的线程不就空了么

路过看看有什么吗发v884885

Vector就是同步的 不用加锁了 我本地试了下没出现楼主说的情况 尴尬了

是不是还没有写入的时候就来读取了啊。

使用一个线程不断读取文本数据,然后将读取的数据存入vector,
然后启动另一个线程不断读取vector,将读到的数据发送至屏幕上,

这不就是典型的“生产者-消费者”模型吗,设置一个缓冲区,很容易解决

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++ 数组和vector的联系
函数声明为 int sum_max(int *ary, int size);现有非空vector<int>data, 请编写调用data为参数的sum_max代码?
OPENCV findContours函数 循坏处理多张图片的时候 vector contours[0]为空?
循环 寻找多张图片轮廓的时候,某张图片出现了contours[0]为空。 但是单独对图片进行处理的时候是没有问题的。 请问一下为什么会出现这样的问题呢?
C#数组里可不可以new 一个Vector3?
public Vector3[] pos = { new Vector3(-175f, 106f, 0f), new Vector3(-43f, 106f, 0f), new Vector3(68f, 106f, 0f) }; 这样声明了一个pos 数组,后面使用pos[0]出错,提示数组下标超出了范围,也就是说数组是空的,这是为什么?
C++中vector的clear()的小问题
就是在我加注释的那一行 在刚创立vector的时候他不就是空的吗,为什么还需要clear()一下 我试了把这行代码删除,然后提交(原本是AC了)就TLE了 这是HD的1520,求教各位大神! ``` #include <iostream> #include <vector> #include <cstdio> #include <cstring> using namespace std; struct node{ int is,no; int v; vector<int> son; }a[6007]; int f[6007]; int n; int max(int a,int b) { return a>b?a:b; } void dfs(int x) { for(int i = 0;i < a[x].son.size();i++) { int t = a[x].son[i]; dfs(t); a[x].is += a[t].no; a[x].no += max(a[t].no,a[t].is); } } int main() { while(~scanf("%d",&n)) { memset(f,0,sizeof(f)); for(int i = 1;i <= n;i++){ scanf("%d",&a[i].v); a[i].son.clear();//这一行 a[i].is = a[i].v; a[i].no = 0; } int son,fa; while(scanf("%d%d",&son,&fa) && son+fa) { a[fa].son.push_back(son); f[son] = 1; } for(int i = 1;i <= n;i++) if(!f[i]) { dfs(i); printf("%d\n",max(a[i].is,a[i].no)); break; } } return 0; } ```
为什么我看了这个关于高校人员信息管理系统设计的代码运行时总是会说找不到“common.h”这个文件,这个那里有错误呢?
#ifndef COMMON_H_INCLUDED #define COMMON_H_INCLUDED #include<string> #include<iostream> #include<iomanip> class COMMON { protected: std::string name; bool sex; int age; std::string id; static int person_sum; static int man_sum; static int woman_sum; public: COMMON(std::string a, bool b, int c, std::string d); virtual ~COMMON(); static int get_person_sum(); static int get_man_sum(); static int get_woman_sum(); virtual void show(){} virtual void show_row(){} virtual bool change(){} std::string get_name(){return name;} bool get_sex(){return sex;} int get_age(){return age;} std::string get_id(){return id;} }; int COMMON::person_sum = 0; int COMMON::man_sum = 0; int COMMON::woman_sum = 0; int COMMON::get_person_sum() { return person_sum; } int COMMON::get_man_sum() { return man_sum; } int COMMON::get_woman_sum() { return woman_sum; } COMMON::COMMON(std::string a, bool b, int c, std::string d): name(a), sex(b), age(c), id(d) { person_sum++; if(b) man_sum++; else woman_sum++; } COMMON::~COMMON() { person_sum--; if(sex) man_sum--; else woman_sum--; } #endif // COMMON_H_INCLUDED tester.h 实验员: #ifndef TESTER_H_INCLUDED #define TESTER_H_INCLUDED #include"common.h" class TESTER: public COMMON { private: std::string laboratory; std::string title; static int tester_sum; public: TESTER(std::string a = "haha", bool b = 1, int c = 19, std::string d = "1", std::string e = "tt", std::string f = "学生"); ~TESTER(); static int get_tester_sum(); virtual void show(); virtual void show_row(); virtual bool change(); std::string get_laboratory(){return laboratory;} std::string get_title(){return title;} }; int TESTER::tester_sum = 0; int TESTER::get_tester_sum() { return tester_sum; } TESTER::TESTER(std::string a, bool b, int c, std::string d, std::string e, std::string f): COMMON(a,b,c,d), laboratory(e), title(f) { tester_sum++; } TESTER::~TESTER() { tester_sum--; } void TESTER::show() { std::cout << "实验员:\n"; std::cout << "姓名:\t\t" << name << std::endl; std::cout << "姓别:\t\t"; if(sex) std::cout << "男\n"; else std::cout << "女\n"; std::cout << "年龄:\t\t" << age << std::endl; std::cout << "ID:\t\t" << id << std::endl; std::cout << "所属实验室:\t" << laboratory << std::endl; std::cout << "职务:\t\t" << title << std::endl; } void TESTER::show_row() { std::cout << std::left << std::setw(8) << name; if(sex) std::cout << std::left << std::setw(8) << "男"; else std::cout << std::left << std::setw(8) << "女"; std::cout << std::left << std::setw(8) << age; std::cout << std::left << std::setw(16) << id; std::cout << std::left << std::setw(16) << laboratory; std::cout << std::left << std::setw(16) << title; std::cout << std::endl; } bool TESTER::change() { std::cout << "姓名:\t\t" ; std::string new_name; std::cin >> new_name; for(unsigned int i = 0; i < new_name.length(); i++) { if(new_name[i] >= '0' && new_name[i] <= '9') { std::cout << "输入非法,输入任意键返回\n"; return 1; } } name = new_name; std::cout << "姓别:\t\t"; std::string a; std::cin >> a; if(sex) man_sum--; else woman_sum--; if(a == "男") sex = 1, man_sum++; else sex = 0, woman_sum++; std::cout << "年龄:\t\t"; std::cin >> age; std::cout << "所属实验室:\t"; std::cin >> laboratory; std::cout << "职务:\t\t"; std::cin >> title; return 0; } #endif // TESTER_H_INCLUDED teacher.h 教师: #ifndef TEACHER_H_INCLUDED #define TEACHER_H_INCLUDED #include"common.h" class TEACHER: virtual public COMMON { protected: std::string department; std::string profession; std::string title; static int teacher_sum; public: TEACHER(std::string a = "xixi", bool b = 1, int c = 30, std::string d = "213", std::string e = "计算机与信息工程学院", std::string f = "计算机科学与技术", std::string g = "教师"); ~TEACHER(); static int get_teacher_sum(); virtual void show(); virtual void show_row(); virtual bool change(); std::string get_department(){return department;} std::string get_profession(){return profession;} std::string get_title(){return title;} }; int TEACHER::teacher_sum = 0; int TEACHER::get_teacher_sum() { return teacher_sum; } TEACHER::TEACHER(std::string a, bool b, int c, std::string d, std::string e, std::string f, std::string g): COMMON(a,b,c,d), department(e), profession(f), title(g) { teacher_sum++; } TEACHER::~TEACHER() { teacher_sum--; } void TEACHER::show() { std::cout << "教师:\n"; std::cout << "姓名:\t\t" << name << std::endl; std::cout << "姓别:\t\t"; if(sex) std::cout << "男\n"; else std::cout << "女\n"; std::cout << "年龄:\t\t" << age << std::endl; std::cout << "ID:\t\t" << id << std::endl; std::cout << "院系:\t\t" << department << std::endl; std::cout << "专业:\t\t" << profession << std::endl; std::cout << "职务:\t\t" << title << std::endl; } void TEACHER::show_row() { std::cout << std::left << std::setw(8) << name; if(sex) std::cout << std::left << std::setw(8) << "男"; else std::cout << std::left << std::setw(8) << "女"; std::cout << std::left << std::setw(8) << age; std::cout << std::left << std::setw(16) << id; std::cout << std::left << std::setw(16) << department; std::cout << std::left << std::setw(16) << profession; std::cout << std::left << std::setw(16) << title; std::cout << std::endl; } bool TEACHER::change() { std::cout << "姓名:\t\t" ; std::string new_name; std::cin >> new_name; for(unsigned int i = 0; i < new_name.length(); i++) { if(new_name[i] >= '0' && new_name[i] <= '9') { std::cout << "输入非法,输入任意键返回\n"; return 1; } } name = new_name; std::cout << "姓别:\t\t"; std::string a; std::cin >> a; if(sex) man_sum--; else woman_sum--; if(a == "男") sex = 1, man_sum++; else sex = 0, woman_sum++; std::cout << "年龄:\t\t"; std::cin >> age; std::cout << "院系:\t\t"; std::cin >> department; std::cout << "专业:\t\t"; std::cin >> profession; std::cout << "职务:\t\t"; std::cin >> title; return 0; } #endif // TEACHER_H_INCLUDED administrator.h 行政人员: #ifndef ADMINISTRATOR_H_INCLUDED #define ADMINISTRATOR_H_INCLUDED #include"common.h" class ADMINISTRATOR: virtual public COMMON { protected: std::string politics; std::string position; static int administrator_sum; public: ADMINISTRATOR(std::string a = "huhu", bool b = 1, int c = 39, std::string d = "176", std::string e = "群众", std:: string f = "社会主义新青年"); ~ADMINISTRATOR(); static int get_administrator_sum(); virtual void show(); virtual void show_row(); virtual bool change(); std::string get_politics(){return politics;} std::string get_position(){return position;} }; int ADMINISTRATOR::administrator_sum = 0; int ADMINISTRATOR::get_administrator_sum() { return administrator_sum; } ADMINISTRATOR::ADMINISTRATOR(std::string a, bool b, int c, std::string d, std::string e, std::string f): COMMON(a,b,c,d), politics(e), position(f) { administrator_sum++; } ADMINISTRATOR::~ADMINISTRATOR() { administrator_sum--; } void ADMINISTRATOR::show() { std::cout << "行政人员:\n"; std::cout << "姓名:\t\t" << name << std::endl; std::cout << "姓别:\t\t"; if(sex) std::cout << "男\n"; else std::cout << "女\n"; std::cout << "年龄:\t\t" << age << std::endl; std::cout << "ID:\t\t" << id << std::endl; std::cout << "政治面貌:\t" << politics << std::endl; std::cout << "职称:\t\t" << position << std::endl; } void ADMINISTRATOR::show_row() { std::cout << std::left << std::setw(8) << name; if(sex) std::cout << std::left << std::setw(8) << "男"; else std::cout << std::left << std::setw(8) << "女"; std::cout << std::left << std::setw(8) << age; std::cout << std::left << std::setw(16) << id; std::cout << std::left << std::setw(16) << politics; std::cout << std::left << std::setw(16) << position; std::cout << std::endl; } bool ADMINISTRATOR::change() { std::cout << "姓名:\t\t" ; std::string new_name; std::cin >> new_name; for(unsigned int i = 0; i < new_name.length(); i++) { if(new_name[i] >= '0' && new_name[i] <= '9') { std::cout << "输入非法,输入任意键返回\n"; return 1; } } name = new_name; std::cout << "姓别:\t\t"; std::string a; std::cin >> a; if(sex) man_sum--; else woman_sum--; if(a == "男") sex = 1, man_sum++; else sex = 0, woman_sum++; std::cout << "年龄:\t\t"; std::cin >> age; std::cout << "政治面貌:\t"; std::cin >> politics; std::cout << "职称:\t\t"; std::cin >> position; return 0; } #endif // ADMINISTRATOR_H_INCLUDED tea&admi.h 教师及行政人员: #ifndef TEAADMI_H_INCLUDED #define TEAADMI_H_INCLUDED #include"teacher.h" #include"administrator.h" class TEAADMI: public TEACHER, public ADMINISTRATOR { private: static int teaadmi_sum; public: TEAADMI(std::string a = "maomao", bool b = 1, int c = 59, std::string d = "0", std::string e = "计算机与信息工程学院", std::string f = "计算机科学与技术", std::string g = "教师", std::string h = "群众", std:: string i = "社会主义新青年"); ~TEAADMI(); static int get_teaadmi_sum(); virtual void show(); virtual void show_row(); virtual bool change(); }; int TEAADMI::teaadmi_sum = 0; int TEAADMI::get_teaadmi_sum() { return teaadmi_sum; } TEAADMI::TEAADMI(std::string a, bool b, int c, std::string d, std::string e, std::string f, std::string g, std::string h, std::string i): COMMON(a,b,c,d), TEACHER(a,b,c,d,e,f,g), ADMINISTRATOR(a,b,c,d,h,i) { teaadmi_sum++; } TEAADMI::~TEAADMI() { teaadmi_sum--; } void TEAADMI::show() { std::cout << "教师及行政人员:\n"; std::cout << "姓名:\t\t" << name << std::endl; std::cout << "姓别:\t\t"; if(sex) std::cout << "男\n"; else std::cout << "女\n"; std::cout << "年龄:\t\t" << age << std::endl; std::cout << "ID:\t\t" << id << std::endl; std::cout << "院系:\t\t" << department << std::endl; std::cout << "专业:\t\t" << profession << std::endl; std::cout << "职务:\t\t" << title << std::endl; std::cout << "政治面貌:\t" << politics << std::endl; std::cout << "职称:\t\t" << position << std::endl; } void TEAADMI::show_row() { std::cout << std::left << std::setw(8) << name; if(sex) std::cout << std::left << std::setw(8) << "男"; else std::cout << std::left << std::setw(8) << "女"; std::cout << std::left << std::setw(8) << age; std::cout << std::left << std::setw(16) << id; std::cout << std::left << std::setw(16) << department; std::cout << std::left << std::setw(16) << profession; std::cout << std::left << std::setw(16) << title; std::cout << std::left << std::setw(16) << politics; std::cout << std::left << std::setw(16) << position; std::cout << std::endl; } bool TEAADMI::change() { std::cout << "姓名:\t\t" ; std::string new_name; std::cin >> new_name; for(unsigned int i = 0; i < new_name.length(); i++) { if(new_name[i] >= '0' && new_name[i] <= '9') { std::cout << "输入非法,输入任意键返回\n"; return 1; } } name = new_name; std::cout << "姓别:\t\t"; std::string a; std::cin >> a; if(sex) man_sum--; else woman_sum--; if(a == "男") sex = 1, man_sum++; else sex = 0, woman_sum++; std::cout << "年龄:\t\t"; std::cin >> age; std::cout << "院系:\t\t"; std::cin >> department; std::cout << "专业:\t\t"; std::cin >> profession; std::cout << "职务:\t\t"; std::cin >> title; std::cout << "政治面貌:\t"; std::cin >> politics; std::cout << "职称:\t\t"; std::cin >> position; return 0; } #endif // TEA&ADMI_H_INCLUDED interface.h 界面: #ifndef INTERFACE_H_INCLUDED #define INTERFACE_H_INCLUDED #include"teacher.h" #include"tester.h" #include"administrator.h" #include"tea&admi.h" #include<stdio.h> #include<stdlib.h> #include<conio.h> /*----------------函数声明-------------------*/ void interface_login(); //初始界面 void interface_Manager(); //管理者界面 void staff_list(); //管理者清单 #include"myfun.h" /*----------------函数定义-------------------*/ void interface_Manager() //管理界面 { int n=1; while(n) { system("cls"); std::cout << "------------欢迎来到只有神知道的领域 o(*≧▽≦)ツ----------\n"; std::cout << "-----------------------------------------------------------\n"; std::cout << "-----------------------------------------------------------\n"; std::cout << "------------- 输入1 添加信息 -------------\n"; std::cout << "------------- 输入2 查询信息 -------------\n"; std::cout << "------------- 输入3 浏览信息 -------------\n"; std::cout << "------------- 输入4 修改信息 -------------\n"; std::cout << "------------- 输入5 删除信息 -------------\n"; std::cout << "------------- 输入6 统计信息 -------------\n"; std::cout << "------------- 输入0 返回上一级 -------------\n"; std::cout << "-----------------------------------------------------------\n"; std::cout << "-----------------------------------------------------------\n"; std::cin >> n; switch(n) { case 1:Add_information();break; case 2: { int a = 1; if(!Query_information()) break; while(a) { std::cout << "输入1 修改信息\n"; std::cout << "输入2 删除信息\n"; std::cout << "输入0 返回上一级\n"; std::cin >> a; switch(a) { case 1:Edit_information(); a = 0; break; case 2:Delete_information(); a= 0; break; } } break; } case 3: { int a=1; while(a) { Browse_information(); std::cout << "输入1 修改信息\n"; std::cout << "输入2 删除信息\n"; std::cout << "输入0 返回上一级\n"; std::cin >> a; switch(a) { case 1:Edit_information(); break; case 2:Delete_information(); break; } } break; } case 4:Edit_information(); break; case 5:Delete_information(); break; case 6:count_information(); break; } } } void interface_login() //登入界面 { int n=1; while(n) { system("cls"); std::cout << "----------欢迎进入高校人员信息管理系统 o(*≧▽≦)ツ--------\n"; std::cout << "-----------------------------------------------------------\n"; std::cout << "-----------------------------------------------------------\n"; std::cout << "------------- 输入1 管理员账号登入 -------------\n"; std::cout << "------------- 输入2 查询信息 -------------\n"; std::cout << "------------- 输入3 浏览信息 -------------\n"; std::cout << "------------- 输入4 统计信息 -------------\n"; std::cout << "------------- 输入5 观看制作信息 -------------\n"; std::cout << "------------- 输入0 关闭系统 -------------\n"; std::cout << "-----------------------------------------------------------\n"; std::cout << "-----------------------------------------------------------\n"; std::cin >> n; switch(n) { case 1:login(); break; case 2:if(Query_information()) std::cout << "输入任意键,返回上一级\n", getch(); break; case 3:Browse_information(); std::cout << "输入任意键,返回上一级\n"; getch(); break; case 4:count_information(); break; case 5:staff_list(); break; } } } void staff_list() //制作人员名单 { system("cls"); std::cout << "-----------------------------------------------------------\n"; std::cout << "-----------------------------------------------------------\n"; std::cout << "--------------Include the following members----------------\n"; std::cout << "-------------- wzy ----------------\n"; std::cout << "-------------- ToRe ----------------\n"; std::cout << "-----------------------------------------------------------\n"; std::cout << "-----------------------------------------------------------\n\n\n"; std::cout << "\n输入任意键返回主菜单…\n"; getch(); } #endif // INTERFACE_H_INCLUDED myfun.h 主要功能实现: #ifndef MYFUN_H_INCLUDED #define MYFUN_H_INCLUDED #include<vector> #include<map> #include<fstream> /*----------------成员声明-------------------*/ std::multimap<std::string, COMMON *> sear; std::vector<TESTER*> tester; std::vector<TEACHER*> teacher; std::vector<ADMINISTRATOR*> administrator; std::vector<TEAADMI*> teaadmi; /*----------------函数声明-------------------*/ void Information_load(); //信息加载 void room_delete(); //释放空间 void login(); //登入函数 void Add_information(); //添加信息 bool Query_information(); //显示查询信息 void Browse_information(); //浏览信息 void Edit_information(); //修改信息 void Delete_information(); //删除信息 void count_information(); //统计信息 /*----------------函数定义-------------------*/ void Information_load() //信息加载 { std::ifstream in; in.open("实验员.txt", std::ios::in); std::string name, id; int age; bool sex; while(in >> name) { std::string laboratory, title; in >> sex >> age >> id >> laboratory >> title; TESTER *t = new TESTER(name,sex,age,id,laboratory,title); tester.push_back(t); sear.insert(make_pair(name, t)); sear.insert(make_pair(id, t)); } in.close(); in.open("教师.txt", std::ios::in); while(in >> name) { std::string department, profession, title; in >> sex >> age >> id >> department >> profession >> title; TEACHER *t = new TEACHER(name,sex,age,id,department,profession,title); teacher.push_back(t); sear.insert(make_pair(name, t)); sear.insert(make_pair(id, t)); } in.close(); in.open("行政人员.txt", std::ios::in); while(in >> name) { std::string politics, position; in >> sex >> age >> id >> politics >> position; ADMINISTRATOR *t = new ADMINISTRATOR(name,sex,age,id,politics,position); administrator.push_back(t); sear.insert(make_pair(name, t)); sear.insert(make_pair(id, t)); } in.close(); in.open("教师&行政人员.txt", std::ios::in); while(in >> name) { std::string department, profession, title, politics, position; in >> sex >> age >> id >> department >> profession >> title >> politics >> position; TEAADMI *t = new TEAADMI(name,sex,age,id,department,profession,title,politics,position); teaadmi.push_back(t); sear.insert(make_pair(name, t)); sear.insert(make_pair(id, t)); } } void room_delete() //释放空间 { for(auto iter:tester) delete iter; for(auto iter:teacher) delete iter; for(auto iter:administrator) delete iter; for(auto iter:teaadmi) delete iter; } void login() //登入函数 { std::string com; system("cls"); std::cout << "请输入密码\n"; getchar(); std::getline(std::cin,com); if(com == "bokuwasinnsekainokamitonaru") interface_Manager(); else { std::cout << "密码错误,输入任意键返回上一级\n"; getch(); } } void Add_information()//添加信息 { system("cls"); std::cout << "请输入添加类型\n1:实验员\t2:教师\t\t3:行政人员\t4:教师及行政人员\n"; int flag; std::cin >> flag; std::string name, se, id; int age; bool sex = 0; std::cout << "ID:\t\t"; std::cin >> id; for(unsigned int i = 0; i < id.length(); i++) { if(id[i] < '0' || id[i] > '9') { std::cout << "输入非法,输入任意键返回\n"; getch(); return; } } std::multimap<std::string, COMMON *>::iterator beg, en; beg = sear.lower_bound(id); en = sear.upper_bound(id); if(beg != en) { std::cout << "此ID已存在,输入任意键返回\n"; getch(); return; } std::cout << "姓名:\t\t"; std::cin >> name; for(unsigned int i = 0; i < name.length(); i++) { if(name[i] >= '0' && name[i] <= '9') { std::cout << "输入非法,输入任意键返回\n"; getch(); return; } } std::cout << "性别:\t\t"; std::cin >> se; if(se == "男") sex = 1; std::cout << "年龄:\t\t"; std::cin >> age; if(flag == 1) { std::string laboratory, title; std::cout << "实验室名称:\t"; std::cin >> laboratory; std::cout << "职务:\t\t"; std::cin >> title; TESTER *t = new TESTER(name,sex,age,id,laboratory,title); tester.push_back(t); sear.insert(make_pair(name, t)); sear.insert(make_pair(id, t)); std::ofstream out; out.open("实验员.txt", std::ios::app); out << name << " " << sex << " " << age << " " << id << " "; out << laboratory << " " << title << std::endl; out.close(); } if(flag == 2) { std::string department, profession, title; std::cout << "院系:\t\t"; std::cin >> department; std::cout << "专业:\t\t"; std::cin >> profession; std::cout << "职务:\t\t"; std::cin >> title; TEACHER *t = new TEACHER(name,sex,age,id,department,profession,title); teacher.push_back(t); sear.insert(make_pair(name, t)); sear.insert(make_pair(id, t)); std::ofstream out; out.open("教师.txt", std::ios::app); out << name << " " << sex << " " << age << " " << id << " "; out << department << " " << profession << " " << title << std::endl; out.close(); } if(flag == 3) { std::string politics, position; std::cout << "政治面貌:\t"; std::cin >> politics; std::cout << "职称:\t\t"; std::cin >> position; ADMINISTRATOR *t = new ADMINISTRATOR(name,sex,age,id,politics,position); administrator.push_back(t); sear.insert(make_pair(name, t)); sear.insert(make_pair(id, t)); std::ofstream out; out.open("行政人员.txt", std::ios::app); out << name << " " << sex << " " << age << " " << id << " "; out << politics << " " << position << std::endl; out.close(); } if(flag == 4) { std::string department, profession, title, politics, position; std::cout << "院系:\t\t"; std::cin >> department; std::cout << "专业:\t\t"; std::cin >> profession; std::cout << "职务:\t\t"; std::cin >> title; std::cout << "政治面貌:\t"; std::cin >> politics; std::cout << "职称:\t\t"; std::cin >> position; TEAADMI *t = new TEAADMI(name,sex,age,id,department,profession,title,politics,position); teaadmi.push_back(t); sear.insert(make_pair(name, t)); sear.insert(make_pair(id, t)); std::ofstream out; out.open("教师&行政人员.txt", std::ios::app); out << name << " " << sex << " " << age << " " << id << " "; out << department << " " << profession << " " << title << " "; out << politics << " " << position << std::endl; out.close(); } std::cout << "注册成功,输入任意键返回\n"; getch(); } void Delete_information() //删除信息 { std::cout << "输入目标ID以确认\n"; std::string aid; std::cin >> aid; for(unsigned int i = 0; i < aid.length(); i++) { if(aid[i] < '0' || aid[i] > '9') { std::cout << "输入非法,输入任意键返回\n"; getch(); return; } } std::multimap<std::string, COMMON *>::iterator beg, en, iter; beg = sear.lower_bound(aid); en = sear.upper_bound(aid); if(beg == en) { std::cout << "目标不存在,输入任意键返回\n"; getch(); return; } std::string aid_name = beg -> second -> get_name(); sear.erase(beg); beg = sear.lower_bound(aid_name); en = sear.upper_bound(aid_name); for(iter = beg; iter != en; ++iter) if(iter -> second -> get_id() == aid) {sear.erase(iter); break;} bool flag = 0; std::ofstream out; out.open("实验员.txt", std::ios::out); for(std::vector<TESTER*>::iterator it = tester.begin(); it != tester.end();) { if((*it) -> get_id() == aid){flag = 1; delete (*it); it = tester.erase(it); continue;} out << (*it) -> get_name() << " " << (*it) -> get_sex() << " "; out << (*it) -> get_age() << " " << (*it) -> get_id() << " "; out << (*it) -> get_laboratory() << " " << (*it) -> get_title() << std::endl; ++it; } out.close(); if(flag) {std::cout << "删除成功,输入任意键返回\n"; getch(); return;} out.open("教师.txt", std::ios::out); for(std::vector<TEACHER*>::iterator it = teacher.begin(); it != teacher.end();) { if((*it) -> get_id() == aid){flag = 1; delete (*it); it = teacher.erase(it); continue;} out << (*it) -> get_name() << " " << (*it) -> get_sex() << " "; out << (*it) -> get_age() << " " << (*it) -> get_id() << " "; out << (*it) -> get_department() << " " << (*it) -> get_profession() << " " << (*it) -> get_title() << std::endl; it++; } out.close(); if(flag) {std::cout << "删除成功,输入任意键返回\n"; getch(); return;} out.open("行政人员.txt", std::ios::out); for(std::vector<ADMINISTRATOR*>::iterator it = administrator.begin(); it != administrator.end();) { if((*it) -> get_id() == aid){flag = 1; delete (*it); it = administrator.erase(it); continue;} out << (*it) -> get_name() << " " << (*it) -> get_sex() << " "; out << (*it) -> get_age() << " " << (*it) -> get_id() << " "; out << (*it) -> get_politics() << " " << (*it) -> get_position() << std::endl; it++; } out.close(); if(flag) {std::cout << "删除成功,输入任意键返回\n"; getch(); return;} out.open("教师&行政人员.txt", std::ios::out); for(std::vector<TEAADMI*>::iterator it = teaadmi.begin(); it != teaadmi.end();) { if((*it) -> get_id() == aid){flag = 1; delete (*it); it = teaadmi.erase(it); continue;} out << (*it) -> get_name() << " " << (*it) -> get_sex() << " "; out << (*it) -> get_age() << " " << (*it) -> get_id() << " "; out << (*it) -> get_department() << " " << (*it) -> get_profession() << " " << (*it) -> get_title() << " "; out << (*it) -> get_politics() << " " << (*it) -> get_position() << std::endl; ++it; } out.close(); std::cout << "删除成功,输入任意键返回\n"; getch(); } void Edit_information() //修改信息 { std::cout << "输入目标ID以确认\n"; std::string aid; std::cin >> aid; for(unsigned int i = 0; i < aid.length(); i++) { if(aid[i] < '0' || aid[i] > '9') { std::cout << "输入非法,输入任意键返回\n"; getch(); return; } } std::multimap<std::string, COMMON *>::iterator beg, en, iter; beg = sear.lower_bound(aid); en = sear.upper_bound(aid); if(beg == en) { std::cout << "目标不存在,输入任意键返回\n"; getch(); return; } system("cls"); bool flag = 0; std::ofstream out; out.open("实验员.txt", std::ios::out); for(auto iter:tester) { if(iter -> get_id() == aid) { iter -> show(), std::cout << "\n\n根据提示输入修改信息\n\n"; while(iter -> change()) { system("cls"); iter -> show(); std::cout << "输入非法,请重新输入\n"; } flag = 1; } out << iter -> get_name() << " " << iter -> get_sex() << " "; out << iter -> get_age() << " " << iter -> get_id() << " "; out << iter -> get_laboratory() << " " << iter -> get_title() << std::endl; } out.close(); if(flag) {std::cout << "修改成功,输入任意键返回\n"; getch(); return;} out.open("教师.txt", std::ios::out); for(auto iter:teacher) { if(iter -> get_id() == aid) { iter -> show(), std::cout << "\n\n根据提示输入修改信息\n\n"; while(iter -> change()) { system("cls"); iter -> show(); std::cout << "输入非法,请重新输入\n"; } flag = 1; } out << iter -> get_name() << " " << iter -> get_sex() << " "; out << iter -> get_age() << " " << iter -> get_id() << " "; out << iter -> get_department() << " " << iter -> get_profession() << " " << iter -> get_title() << std::endl; } out.close(); if(flag) {std::cout << "修改成功,输入任意键返回\n"; getch(); return;} out.open("行政人员.txt", std::ios::out); for(auto iter:administrator) { if(iter -> get_id() == aid) { iter -> show(), std::cout << "\n\n根据提示输入修改信息\n\n"; while(iter -> change()) { system("cls"); iter -> show(); std::cout << "输入非法,请重新输入\n"; } flag = 1; } out << iter -> get_name() << " " << iter -> get_sex() << " "; out << iter -> get_age() << " " << iter -> get_id() << " "; out << iter -> get_politics() << " " << iter -> get_position() << std::endl; } out.close(); if(flag) {std::cout << "修改成功,输入任意键返回\n"; getch(); return;} out.open("教师&行政人员.txt", std::ios::out); for(auto iter:teaadmi) { if(iter -> get_id() == aid) { iter -> show(), std::cout << "\n\n根据提示输入修改信息\n\n"; while(iter -> change()) { system("cls"); iter -> show(); std::cout << "输入非法,请重新输入\n"; } flag = 1; } out << iter -> get_name() << " " << iter -> get_sex() << " "; out << iter -> get_age() << " " << iter -> get_id() << " "; out << iter -> get_department() << " " << iter -> get_profession() << " " << iter -> get_title() << " "; out << iter -> get_politics() << " " << iter -> get_position() << std::endl; } out.close(); std::cout << "修改成功,输入任意键返回\n"; getch(); } bool Query_information() //查询函数 { system("cls"); std::cout << "输入目标姓名或ID以查询\n"; std::string aid; std::cin >> aid; std::multimap<std::string, COMMON *>::iterator beg, en, iter; beg = sear.lower_bound(aid); en = sear.upper_bound(aid); if(beg == en) { std::cout << "查询结果为空,输入任意键返回\n"; getch(); return 0; } for(iter = beg; iter != en; ++iter) { iter -> second -> show(); std::cout << std::endl; } return 1; } void Browse_information() //浏览函数 { system("cls"); std::cout << "-------------------实验员-------------------\n"; std::cout << "姓名\t" << "性别\t" << "年龄\t" << "ID\t\t" << "实验室名称\t" << "职务\n"; for(auto iter:tester) iter -> show_row(); std::cout << "\n------------------行政人员------------------\n"; std::cout << "姓名\t" << "性别\t" << "年龄\t" << "ID\t\t" << "政治面貌\t" << "职称\n"; for(auto iter:administrator) iter -> show_row(); std::cout << "\n--------------------教师--------------------\n"; std::cout << "姓名\t" << "性别\t" << "年龄\t" << "ID\t\t" << "院系\t\t" << "专业\t\t" << "职务\n"; for(auto iter:teacher) iter -> show_row(); std::cout << "\n-----------------行政人员&教师--------------\n"; std::cout << "姓名\t" << "性别\t" << "年龄\t" << "ID\t\t" << "政治面貌\t" << "职称\t\t" << "院系\t\t" << "专业\t\t" << "职务\n"; for(auto iter:teaadmi) iter -> show_row(); } void count_information() //统计信息 { system("cls"); std::cout << "员工总人数:\t\t" << COMMON::get_person_sum() << std::endl; std::cout << "男性人数:\t\t" << COMMON::get_man_sum() << std::endl; std::cout << "女性人数:\t\t" << COMMON::get_woman_sum() << std::endl; std::cout << "教师人数:\t\t" << TEACHER::get_teacher_sum() << std::endl; std::cout << "实验员人数:\t\t" << TESTER::get_tester_sum() << std::endl; std::cout << "行政管理人员人数:\t" << ADMINISTRATOR::get_administrator_sum() << std::endl; std::cout << "行政管理人员&教师人数:\t" << TEAADMI::get_teaadmi_sum() << std::endl; std::cout << "\n\n输入任意键返回上一级\n"; getch(); } #endif // MYFUN_H_INCLUDED main.cpp 主函数: #include"interface.h" int main() { Information_load(); //加载信息 interface_login(); //首界面 room_delete(); //释放空间 // count_information(); return 0; }
派生类存放在基类类型vector中,怎么用派生类的函数?
我已经成功将派生类存放在基类类型的vector表中,也能定位位置,就是不知道怎么使用派生类的函数,只能用基类的函数,求解啊! #include<iostream> #include<vector> #include<algorithm> #include<string.h> using namespace std; class people { public: people() { name = new char[20]; code = 0; sex = new char[8]; number = new char[20]; }; bool people::operator==(const people &rhs) const { return (code == rhs.code); }; void in_mess() { cout << "输入名字、编号、性别、身份证号" << endl; cin >> name; cin >> code; cin >> sex; cin >> number; }; const int consttime = 10; void out_mess() { cout << "名字:" << name << endl; cout << "编号:" << code << endl; cout << "性别:" << sex << endl; cout << "身份证号:" << number << endl; }; int seach() { return code; }; void eq_SC(int a) { code = a; } private: char *name; int code; char *sex; char *number; }; class student : virtual public people { public: student(){}; friend istream&operator>>(istream&in, student &p) { p.in_mess(); return in; }; void out_messs() { people::out_mess(); cout << "身份:学生" << endl; cout << "总学时:" << consttime << endl; } }; class teacher :virtual public people { public: teacher() { teachtime = 0; }; friend istream&operator>>(istream&in, teacher &p) { p.in_mess(); cout << "身份:老师" << endl; cout << "输入教学学时" << endl; in >> p.teachtime; return in; } void out_messs() { people::out_mess(); cout << "身份:老师" << endl; cout << "总学时:" << teachtime + consttime << endl; } int get_TT() { return teachtime + consttime; } private: int teachtime; }; class graduate : virtual public student { public: graduate() { freetime = 0; }; friend istream&operator>>(istream&in, graduate &p) { p.in_mess(); cout << "身份:研究生" << endl; cout << "输入自由研究时间" << endl; in >> p.freetime; return in; } void out_messs() { people::out_mess(); cout << "身份:研究生" << endl; cout << "总学时:" << freetime + consttime << endl; } int get_FT() { return freetime+consttime; } private: int freetime; }; class TA : public graduate, public teacher { public: TA() { resarch_time = 0; }; friend istream&operator>>(istream&in, TA &p) { p.in_mess(); cout << "身份:助教" << endl; cout << "输入做研究和一定教学工作学时" << endl; in >> p.resarch_time; return in; }; void out_messs() { people::out_mess(); cout << "身份:助教" << endl; cout << "总学时:" << resarch_time +consttime+get_FT()+get_TT() << endl; }; private: int resarch_time; }; void main() { cout << "当前为空表,请输入第一个人员的信息" << endl; cout << "插入身份为 1.学生 2.老师 3.研究生 4.助教 请输入序号" << endl; int num=0; people first; cin >> num; if (num == 1) { student first; cin >> first; } else if (num == 2) { teacher first; cin >> first; } else if (num == 3) { graduate first; cin >> first; } else if (num == 4) { TA first; cin >> first; }; vector<people>::iterator location;//迭代子 vector<people>V(1, first); while (1) { int gong; cout << "请选择功能" << endl; cout << "1.插入新的信息 2.查找 " << endl; cin >> gong; if (gong == 1) { cout << "插入身份为 1.学生 2.老师 3.研究生 4.助教 请输入序号" << endl; int num; cin >> num; if (num == 1) { student human; cin >> human; V.push_back(human); } else if (num == 2) { teacher human; cin >> human; V.push_back(human); } else if (num == 3) { graduate human; cin >> human; V.push_back(human); } else if (num == 4) { TA human; cin >> human; V.push_back(human); }; } else if (gong == 2) { people _new; int studycodee; cout << "请输入他(她)的编号" << endl; cin >> studycodee; _new.eq_SC(studycodee); location = find(V.begin(), V.end(), _new); if (location != V.end()) { V[location - V.begin()].out_mess(); } else cout << "未找到" << endl; } } } 下面查找功能只能用到其基类的函数,用不到派生类的,我觉得是因为vector是存放的people类导致的,但是即使我将其派生并且重新放置派生类进去,它依然只认基类不认派生类函数啊!怎么办呀!
返回右值引用为什么在下面的情况出错
#include <vector> void main() { std::vector<int> a=getvec(); } std::vector<int> && getvec() { std::vector<int> a; a.push_back(1); return std::move(a); } //返回的是空的向量
weblogic的Servlet创建之后,报空指针异常
各位前辈,帮忙一下 weblogic的Servlet创建之后,报空指针异常 但是找不出原因 所有代码如下:【只有一个servlet,且数据源配置正常,实验过了的,web.xml也配置完成】 ``` package myservlet; import java.awt.Container; import java.io.IOException; import java.io.PrintWriter; import java.sql.ResultSet; import java.util.Hashtable; import java.util.Properties; import java.util.Vector; import javax.activation.DataSource; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.spi.DirStateFactory.Result; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.mysql.jdbc.Connection; import com.mysql.jdbc.PreparedStatement; import com.mysql.jdbc.Statement; import com.mysql.jdbc.StatementImpl; import javax.naming.*; import javax.sql.*; import java.sql.*; import java.util.*; public class StudentServlet extends HttpServlet { public StudentServlet(){ super(); } public void destroy() { super.destroy(); } private static final String CONTENT_TYPE="text/html;charset=GBK"; //Do Get 方法 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); //打印网页 out.println("<HTML>"); out.println("<HEAD><TITLE>StudentServlet</TITLE></HEAD>"); out.println("<BODY bgcolor=\"#fffff\">"); if ((request.getParameter("sno"))==null ||(request.getParameter("sno")).equals("input number")){ out.println( "<form method='post' action='/lab05-2/src/myservlet/StudentServlet'>"); //"<form method='post' action='/lab05-2/StudentServlet'>"); out.println(""); out.println( "学号查询:<input type='text' name='sno' vaule='input number'/>"); out.println("<input type ='submit' vaule='查询'/><br>"); out.println("</form>"); } //另外一种情况 else if(!(request.getParameter("sno")).equals("input number")){ Vector vc =new Vector(); out.println("<Form method='post' action='/lab05-2/src/myservlet/StudentServlet'>"); out.println(""); out.println("学生学号:<input type='text' name='sno' />"); out.println("<input type ='submit' vaule='查询'/><br>"); out.println("</form>"); out.println("<hr>"); out.println("<table border='1'><tr>"); out.println("<th>学号</th><th>姓名</th><th>语文</th><th>数学</th></tr>"); try{ if((vc=accessDB(Integer.parseInt((String)request.getParameter("sno"))))!=null){ out.println("<tr>"); out.println("<td>"+vc.elementAt(0)+"</td>"); out.println("<td>"+vc.elementAt(1)+"</td>"); out.println("<td>"+vc.elementAt(2)+"</td>"); out.println("<td>"+vc.elementAt(3)+"</td>"); out.println("</tr>"); } }catch(Exception e) { out.println("<tr>"); out.println("<td>没有记录</td>"); out.println("</tr>"); out.println("<td>数据库里没有你要查询的记录</td>"); e.printStackTrace(); } out.println("</table>"); } out.println("</BODY>"); out.println("</HTML>"); out.flush(); out.close(); } //Do Post方法 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } //Init方法 public void init() throws ServletException { } //通过weblogic的JNDI服务来查询数据库数据 public Vector accessDB(int id){ Vector vc=new Vector(); Context ctx; javax.sql.DataSource ds = null; java.sql.Connection myConn = null ; final String JNDI_DATABASE_NAME="AA"; Properties ht =new Properties(); //Hashtable ht = new Hashtable(); ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); ht.put(Context.PROVIDER_URL, "t3://localhost:7001"); try{ ctx = new InitialContext(ht); ds = (javax.sql.DataSource)ctx.lookup(JNDI_DATABASE_NAME); }catch(Exception e){ e.printStackTrace(); } if(ds == null){ System.out.println("Eorror !!!"); } else{ System.out.println("Connection is OK !!!"); } java.sql.PreparedStatement myStatement = null; ResultSet mySet = null; try{ myConn=ds.getConnection(); myStatement=myConn.prepareStatement("select * from stdb where sno=?"); myStatement.setInt(1, id); mySet=myStatement.executeQuery(); while (mySet.next()){ vc.add(Integer.toString(mySet.getInt("sno"))); vc.add(mySet.getString("sname")); vc.add(Integer.toString(mySet.getInt("chinese"))); vc.add(Integer.toString(mySet.getInt("math"))); } //关闭 myStatement.close(); mySet.close(); myConn.close(); return vc;//返回vc }catch(Exception e) { e.printStackTrace(); } return vc; } public static void main(String[] args) { StudentServlet aa=new StudentServlet(); System.out.println(aa.accessDB(100).elementAt(1)); } } ``` ![图片说明](https://img-ask.csdn.net/upload/201910/20/1571542376_553297.png) 【aa和student只是测试着用,与StudentServlet无关】 报错为: ![图片说明](https://img-ask.csdn.net/upload/201910/20/1571542511_665195.png) 大概就是这些,请指教, 初学,找过百度等也没有解决
迷宫问题的代码看不懂了,求大佬注释
为啥要这么定义pos?都没怎么看懂,,,和普通01迷宫有点差别,,生成全联通迷宫找最短路径,,求大佬注释55 ``` #include "pch.h"// pch.cpp: 与预编译标头对应的源文件;编译成功所必需的 #define INT_N 999 #define MAX_DIS 2147483647 using namespace std;//using声明,使程序可以使用程序包含的任何标准C++头文件中的所有名字 Node::Node() { } Node::~Node()//析构函数 { } int Graph::findEdge(int node)//找所有节点边的位置 { int pos = node / N * (N - 1) + node % N;//定义一个节点的行值 int e = 0; if (node%N == 0)//无左邻居 { if (row[pos]) e |= Right;//就向右插边 } else if (node%N == N - 1)//无右邻 { if (row[pos - 1]) e |= Left;//就向左插边 } else { if (row[pos]) e |= Right; if (row[pos - 1]) e |= Left; } int p2 = (node%N)*(N - 1) + node / N;//定义节点的列值 if (node < N) { //无上邻居 if (col[p2]) e |= Down;//可以向下插边 } else if (node >= N * (N - 1)) { //无下邻 if (col[p2 - 1]) e |= Up;//可以向上插边 } else { if (col[p2]) e |= Down; if (col[p2 - 1]) e |= Up; } return e;//返回节点的边,存在e里,得到所有边的位置 } void Graph::make_rand(int * a) { int p = rand() % 4; int q = rand() % 4; if (p != q) { int n = a[p]; a[p] = a[q]; a[q] = n; } } int Graph::findNode(int node, int Direction) { if (Direction & Left) { if (node%N != 0) return node - 1; else return -1; } else if (Direction & Right) { if (node%N == N - 1) return -1; else return node + 1; } else if (Direction &Up) { node = node - N; if (node < 0) return -1; return node; } else if (Direction & Down) { node = node + N; if (node > N*N - 1) return -1; return node; } return -1; } int Graph::findNode2(int node, int Direction) { int pos = node / N * (N - 1) + node % N; int pos2 = (node%N)*(N - 1) + node / N; if (Direction & Left) { if (node%N != 0 && row[pos - 1]) return node - 1; else return -1; } else if (Direction & Right) { if (node%N != (N - 1) && row[pos]) return node + 1; else return -1; } else if (Direction &Up) { node = node - N; if (node >= 0 && col[pos2 - 1]) return node; return -1; } else if (Direction & Down) { node = node + N; if (node > N*N - 1) return -1; if (col[pos2]) return node; return -1; } return -1; } void Graph::addEdge(int node, int Direction) { if (Direction & Left || Direction & Right) { //左右方向-- int pos = node / N * (N - 1) + node % N; if ((Direction & Left) && node%N != 0) row[pos - 1] = true; if ((Direction & Right) && node%N != N - 1) row[pos] = true; } if (Direction & Up || Direction & Down) { //上下方向-- int p2 = (node%N)*(N - 1) + node / N; if ((Direction & Down) && node < N*(N - 1)) col[p2] = true; if ((Direction &Up) && node > (N - 1)) col[p2 - 1] = true; } } void Graph::insertEdge(int from) { //从from起 插入条边 bool add = false; for (int start = from; start < 2 * N*(N - 1); start++) { int pos = 0; int r = start / (2 * N - 1); int c = start % (2 * N - 1); if (c > N - 1) { //列 pos = (c - (N - 1))*(N - 1) + r; if (col[pos] == false) { col[pos] = true; //add = true; return; } } else { //行 pos = r * (N - 1) + c; if (row[pos] == false) { row[pos] = true; return; } } } for (int start = from; start >= 0; start--) { int pos = 0; int r = start / (2 * N - 1); int c = start % (2 * N - 1); if (c > N - 1) { //列 pos = (c - (N - 1))*(N - 1) + r; if (col[pos] == false) { col[pos] = true; //add = true; return; } } else { //行 pos = r * (N - 1) + c; if (row[pos] == false) { row[pos] = true; return; } } } } void Graph::test(int node) { int e = findEdge(node); printf("node=%d,Up=%d,Down=%d,Left=%d,Right=%d", node, e&Up, e&Down, e&Left, e&Right); } Graph::Graph(int n) { N = n; if (N < 2) N = 2; row = new bool[N*(N - 1)]; col = new bool[N*(N - 1)]; } Graph::~Graph() { delete col; delete row; } bool Graph::travel(int start, vector<int> & visit, bool * have) { int count = N * N; int order[4] = { Left,Right,Up,Down }; int c = 0; int node2 = 0; while (visit.size() < count) { if (c == 0) { c = 1; } else start = visit.back(); //随机找一个方向开始-- make_rand(order); bool insert = false; for (int j = 0; j < 4; j++) { node2 = findNode(start, order[j]); if (node2 >= 0 && have[node2] == false) { visit.push_back(node2); have[node2] = true; addEdge(start, order[j]);//添加这个方向的边 insert = true; break; } } if (insert == false) return false; } return true; } void Graph::create() { srand((unsigned)time(NULL)); int total = N * N; bool * have = new bool[total]; int i = 0; for (i = 0; i < total; i++) have[i] = false; for (i = 0; i < N*(N - 1); i++) { row[i] = false; col[i] = false; } vector<int> visit;//已访问的节点表 vector<int> starts;//起点表 int start = rand() % total; visit.insert(visit.end(), start); have[start] = true; starts.push_back(start); bool ok = travel(start, visit, have); while (ok == false) { start = visit[rand() % visit.size()]; int nRet = std::count(starts.begin(), starts.end(), start); if (nRet > 0) { for (int j = 0; j < visit.size(); j++) { start = visit[j]; nRet = std::count(starts.begin(), starts.end(), start); if (nRet == 0) break; } } ok = travel(start, visit, have); starts.push_back(start); } //随机 添加一部分边-- int max = 2 * N * (N - 1); int min = N * N - 1; int need = (max + min) / 2; for (int k = min; k <= need; k++) { //--暂时留空-- int edge = rand() % max;//随机增加的边 //随机找一个起点,增加一个边 insertEdge(edge); } delete have; } void Graph::print() { int i, pos, pos2; char buf[300]; char buf2[300]; char buf3[10]; int max = N * N - 1; sprintf_s(buf3, "%d", max); int len = strlen(buf3); memset(buf3, 0, 10); for (i = 0; i < N*N; i++) { if (i%N == 0) { if (i > 0) { printf("%s\n", buf); printf("%s\n", buf2); } memset(buf, 0, 300); memset(buf2, 0, 300); memset(buf3, 0, 10); } if (len == 1) sprintf_s(buf3, "%d", i); else if (len == 2) sprintf_s(buf3, "%02d", i); else if (len == 3) sprintf_s(buf3, "%03d", i); else if (len == 4) sprintf_s(buf3, "%04d", i); else { printf("too big"); return; } strcat_s(buf, buf3); pos = i / N * (N - 1) + i % N;//(N-1); if (i%N != (N - 1)) { if (row[pos]) strcat_s(buf, "-"); else strcat_s(buf, " "); } pos2 = (i%N)*(N - 1) + i / N; if (i < N*(N - 1)) { if (col[pos2]) { if (len == 1) strcat_s(buf2, "| "); else if (len == 2) strcat_s(buf2, " | "); else if (len == 3) strcat_s(buf2, " | "); else if (len == 4) strcat_s(buf2, " | "); } else { if (len == 1) strcat_s(buf2, " "); else if (len == 2) strcat_s(buf2, " "); else if (len == 3) strcat_s(buf2, " "); else if (len == 4) strcat_s(buf2, " "); } } } printf("%s\n", buf); printf("%s\n", buf2); } void Graph::print2() { int i, pos, pos2; char buf[300]; char buf2[300]; char buf3[10]; int max = N * N - 1; sprintf_s(buf3, "%d", max); int len = strlen(buf3); memset(buf3, 0, 10); for (i = 0; i < N*N; i++) { if (i%N == 0) { if (i > 0) { printf("%s\n", buf); printf("%s\n", buf2); } memset(buf, 0, 300); memset(buf2, 0, 300); memset(buf3, 0, 10); } if (len == 1) sprintf_s(buf3, "%d", i); else if (len == 2) sprintf_s(buf3, "%02d", i); else if (len == 3) sprintf_s(buf3, "%03d", i); else if (len == 4) sprintf_s(buf3, "%04d", i); else { printf("too big"); return; } strcat_s(buf, buf3); pos = i / N * (N - 1) + i % N;//(N-1); if (i%N != (N - 1)) { if (row[pos]) strcat_s(buf, "--"); else strcat_s(buf, " "); } pos2 = (i%N)*(N - 1) + i / N; if (i < N*(N - 1)) { if (col[pos2]) { if (len == 1) strcat_s(buf2, "| "); else if (len == 2) strcat_s(buf2, " | "); else if (len == 3) strcat_s(buf2, " | "); else if (len == 4) strcat_s(buf2, " | "); } else { if (len == 1) strcat_s(buf2, " "); else if (len == 2) strcat_s(buf2, " "); else if (len == 3) strcat_s(buf2, " "); else if (len == 4) strcat_s(buf2, " "); } } } printf("%s\n", buf); printf("%s\n", buf2); } int Graph::edgeCount() { int edge = 0; int Count = N * (N - 1); for (int i = 0; i < Count; i++) { if (row[i]) edge++; if (col[i]) edge++; } return edge; } void Graph::path(int st, int en) { if (st == en) { printf("%d %d", st, en); return; } stack<int> nodes; stack<int> edges; int Direction[4] = { Left,Up,Right,Down }; bool * visited = new bool[N*N]; int i = 0; for (i = 0; i < N*N; i++) visited[i] = false; nodes.push(st); edges.push(-1); visited[st] = true; //visit.push(st); while (nodes.empty() == false) { int n = nodes.top(); int dir = edges.top(); int n2 = -1; while (dir < 3 && n2 < 0) {//dir={-1,0,1,2}=>{0,1,2,3} dir++; n2 = findNode2(n, Direction[dir]); //是否可通-- if (n2 >= 0) { if (visited[n2]) n2 = -1; else break; } } if (n2 < 0) { visited[n] = false;//退出该节点了 nodes.pop(); edges.pop(); } else { edges.pop(); edges.push(dir); if (n2 == en) { //找到了-- //stack<int> print = nodes; nodes.push(n2); print_stack(nodes); nodes.pop(); int dir2 = edges.top(); if (dir2 == 3) { //退栈-- int n3 = nodes.top(); nodes.pop(); edges.pop(); visited[n3] = false; } } else { nodes.push(n2); edges.push(-1); visited[n2] = true; } } } delete visited; } void Graph::shortpath(int st, int en) { if (st == en) { printf("%d %d", st, en); return; } vector< stack<int> > pathes;//所有的路径 int path_len = N * N + 1;//路径长度,最大 stack<int> nodes; stack<int> edges; int Direction[4] = { Left,Up,Right,Down }; bool * visited = new bool[N*N]; int i = 0; for (i = 0; i < N*N; i++) visited[i] = false; nodes.push(st); edges.push(-1); visited[st] = true; //visit.push(st); while (nodes.empty() == false) { //判断当前路径是否超出了最短路径--- if (nodes.size() > path_len) { int n3 = nodes.top(); visited[n3] = false; nodes.pop(); edges.pop(); continue; } int n = nodes.top(); int dir = edges.top(); int n2 = -1; while (dir < 3 && n2 < 0) {//dir={-1,0,1,2}=>{0,1,2,3} dir++; n2 = findNode2(n, Direction[dir]); //是否可通-- if (n2 >= 0) { if (visited[n2]) n2 = -1; else break; } } if (n2 < 0) { visited[n] = false;//退出该节点了 nodes.pop(); edges.pop(); } else { edges.pop(); edges.push(dir); if (n2 == en) { //找到了-- //stack<int> print = nodes; nodes.push(n2); if (nodes.size() < path_len) { pathes.clear(); pathes.push_back(nodes); path_len = nodes.size(); } else if (nodes.size() == path_len) { pathes.push_back(nodes); } printf("path_len=%d\n", path_len); nodes.pop(); int dir2 = edges.top(); if (dir2 == 3) { //退栈-- int n3 = nodes.top(); nodes.pop(); edges.pop(); visited[n3] = false; } } else { nodes.push(n2); edges.push(-1); visited[n2] = true; } } } delete visited; print_pathes(pathes);//输出所有的路径 } void Graph::print_stack(stack<int> nodes) { vector<int> list; while (nodes.empty() == false) { list.insert(list.begin(), nodes.top()); nodes.pop(); } bool first = true; for (auto val : list) { if (first) printf("%d", val); else printf(" %d", val); first = false; } printf("\n"); } void Graph::print_stack2(stack<int> path) { bool first = true; while (path.empty() == false) { if (first) printf("%d", path.top()); else printf(" %d", path.top()); first = false; path.pop(); } printf("\n"); } void Graph::print_pathes(vector<stack<int>> pathes) { for (auto val : pathes) { print_stack(val); //printf("\n"); } } void Graph::dfs_start() { stack<int> path; bool * visited = new bool[N*N]; for (int i = 0; i < N*N; i++) visited[i] = false; dfs(visited, path, 0); print_stack(path); delete visited; } void Graph::dfs(bool * visited, stack<int>& path, int v) { int Direction[4] = { Left,Up,Right,Down }; visited[v] = true; path.push(v); for (int i = 0; i < 4; i++) { int n = findNode2(v, Direction[i]); if (n >= 0 && visited[n] == false) { dfs(visited, path, n); } } } void Graph::shortpath2(int from, int to) { if (from < 0 || from >= N * N || to < 0 || to >= N * N) { printf("输入错误。\n"); return; } if (from == to) { printf("%d %d\n", from, to); return; } vector<Node> nodes;//节点次序 nodes.resize(N*N);// reserve(N*N); vector<int> S, U; //U.resize(N*N);// reserve(N*N); int i = 0; for (i = 0; i < N*N; i++) { //将所有的节点-按次序存入nodes nodes[i].id = i; nodes[i].dis = Juli(from, i); if (nodes[i].dis == 1) {//记下前驱节点 nodes[i].prev.push_back(from); } if (i != from) U.push_back(i);//其他节点存入U中 } int sindex = 0; S.push_back(from); //--开始计算过程 while (U.empty() == false) { vector<int> nodelist;//节点编号表,具体情况查nodes //int size = S.size(); for (; sindex < S.size(); sindex++) { //查找u中,距离S[index]最近的节点,形成节点表 int d = MAX_DIS; for (int u : U) { if (contains(nodes[u].prev, S[sindex])) {//前驱节点是s[i] if (nodes[u].dis < d) { nodelist.clear(); nodelist.push_back(u); d = nodes[u].dis; } else if (nodes[u].dis == d && d != MAX_DIS) { nodelist.push_back(u);//同样距离的点 } } } //将nodelist的值加入到S中,并从U中去掉 for (int n : nodelist) { S.push_back(n); U.erase(std::remove(std::begin(U), std::end(U), n), std::end(U)); } //--用nodelist的值更新-nodes中的距离和前驱 for (int n : nodelist) { // //若-以n为中间节点距离更短,则将nodes中的当前节点的前驱修改为n for (int u : U) { int d = Juli(n, u);//计算两点间的距离 if (d != MAX_DIS) { if (nodes[n].dis + d < nodes[u].dis) { nodes[u].prev.clear(); nodes[u].prev.push_back(n);//以n为前驱 nodes[u].dis = nodes[n].dis + d; } else if (nodes[n].dis + d == nodes[u].dis) { //同样距离的点 nodes[u].prev.push_back(n); } } } } nodelist.clear(); } } //遍历nodes,输出所有的路径-- allpath(from, to, nodes); } int Graph::Juli(int from, int to) { if (from == to) return 0; if (findNode2(from, Left) == to) return 1; if (findNode2(from, Up) == to) return 1; if (findNode2(from, Right) == to) return 1; if (findNode2(from, Down) == to) return 1; return MAX_DIS; } bool Graph::contains(vector<int> vec, int val) { int nRet = count(vec.begin(), vec.end(), val); return nRet > 0; } void Graph::allpath(int from, int to, vector<Node>& nodes) { stack<int> path; allpath_dfs(path, to, nodes, from); } void Graph::allpath_dfs(stack<int>& path, int to, vector<Node>& nodes, int src) { path.push(to); if (to == src) { print_stack2(path); path.pop(); return; } vector<int> prevlist = nodes[to].prev;//前驱节点 for (int v : prevlist) { allpath_dfs(path, v, nodes, src); } path.pop(); } int main() { int N = 2; printf("输入边的大小 N="); scanf_s("%d", &N); Graph g(N); g.create();//生成迷宫 g.print();//输出迷宫 printf("\nedge count=%d\n", g.edgeCount());//迷宫现有的边数 /* g.test(0); g.test(4); g.test(10); */ g.dfs_start();//深度优先遍历,证明迷宫的连通性 int from=0, to=0; printf("输入起点:"); scanf_s("%d", &from); printf("输入终点:"); scanf_s("%d", &to); printf("计算从%d到%d的最短路径有:\n",from,to); return 0; } ```
应用SVR对负荷数据进行回归分析,测试集出来的数为一条直线?
应用SVR对负荷数据进行回归分析,测试集出来的数为一条直线? ``` import numpy as np from sklearn.svm import SVR import pandas as pd import matplotlib.pyplot as plt import xlrd # 打开指定路径中的xls文件,得到book对象 xls_file = "bb.xls" #打开指定文件 book = xlrd.open_workbook(xls_file) # 通过sheet索引获得sheet对象 sheet1 = book.sheet_by_index(0) # # 获得指定索引的sheet名 # sheet1_name = book.sheet_names()[0] # print(sheet1_name) # # 通过sheet名字获得sheet对象 # sheet1 = book.sheet_by_name(sheet1_name) # 获得行数和列数 # 总行数 nrows = sheet1.nrows #总列数 ncols = sheet1.ncols # 遍历打印表中的内容 row_list=[] for i in range(nrows): for j in range(ncols): cell_value = sheet1.cell_value(i, j) row_list.append (cell_value)#append函数的用处为往一个空矩阵添加元素 x=range(1,156) #绘制横坐标时间数据 #提取Excel表里的数据cell_value即是y值 x1=np.array(x) X=x1.reshape((len(x1),1))##reshape用于转置 y=np.array(row_list) X_train=np.array(X[0:123]) #训练集124 X_test=np.array(X[124:154]) y_train=np.array(y[0:123]) #测试集31 y_test=np.array(y[124:154]) svr_rbf=SVR(kernel='rbf',C=1e3,gamma=0.1) #使用 rbf核进行拟合 clf=svr_rbf.fit(X_train,y_train) #训练得到分类器#中括号的用途 y_rbf=clf.predict(X) #预测的输出 ax=plt.subplot(111) ax.scatter(X_train,y_train,c='r',label='train') #训练集真实值的散点图 ax.scatter(X_test,y_test,c='g',label='test') #测试集真实值的散点图 ax.plot(X,y_rbf,c='b',label='RBF model') #训练集的拟合结果 #测试集的结果为一常值,是因为数据集未进行归一化处理 plt.xlabel('day') plt.ylabel('target') plt.title('Support Vector Regression') plt.legend() plt.show() 程序运行结果如下: ```![图片说明](https://img-ask.csdn.net/upload/201911/14/1573715524_788157.png) ``` 请各位大佬指点!! ``` ```
Attribute.GetCustomAttribute() 返回值为空
namespace LookUpWhatsNew { internal class WhatsNewChecker { private static readonly StringBuilder outPutText = new StringBuilder(); private static DateTime backDateTo = new DateTime(2010,2,1); static void Main(string[] args) { Assembly theAssembly = Assembly.Load("VectorClass"); Attribute supportsAttibute = Attribute.GetCustomAttribute(theAssembly, typeof(LastModifiedAttribute));// supportsAttibute 为空! Conso.Read(); namespace WhatNewAttributes { [AttributeUsage(AttributeTargets .Class |AttributeTargets.Method ,AllowMultiple =true ,Inherited =false )] public class LastModifiedAttribute:Attribute { private readonly DateTime dateModified; private readonly string changes; public LastModifiedAttribute(string dateModified, string changes) { this.dateModified = DateTime.Parse(dateModified); this.changes = changes; } public DateTime DateModified { get { return this.dateModified; } } public string Changes { get { return this.changes; } } public string Issues { get; set; } } [AttributeUsage(AttributeTargets.Assembly)] public class SupportWhatsNewAttribute : Attribute { } } namespace VectorClass { [LastModifiedAttribute("14,Feb,2010", "IEnumerable interface implemented so vector can now be treated as a Collection")] [LastModifiedAttribute("10,Feb,2010", "IFormattable interface implemented so vector now responds to format specifiers N and VE")] public class Vector:IEnumerable ,IFormattable { public double x, y, z; public Vector(double x,double y,double z) { this.x = x; this.y = y; this.z = z; } [LastModifiedAttribute("10,Feb,2010", "Method added in order to formating support")] public string ToString(string format, IFormatProvider formatProvider) { if (format == null) { return ToString(); } switch (format) { case "N": return string.Format("({0},{1},{2})", x, y, z); case "VE": return string.Format("{0}i+{1}j+{2}k", x, y, z); default: throw new ArgumentException("No {0} format !", format); } } public string ToString(string format) { return ToString(format, null); } public IEnumerator GetEnumerator() { yield return x; yield return y; yield return z; } [LastModifiedAttribute("14,Feb,2010", "Class create as part of collection support for Vector")] private class VectorIEnumerator : IEnumerator { public object Current { get { throw new NotImplementedException(); } } public bool MoveNext() { throw new NotImplementedException(); } public void Reset() { throw new NotImplementedException(); } } } }
小白问c++中关于getline函数的问题
![图片说明](https://img-ask.csdn.net/upload/201602/09/1455032023_189655.png) 问题如图上的注释,为什么一定要在循环体之前加一个getline函数才能让vector中第一个元素读入字符串,否则vector中第一元素就是空字符串? #include<iostream> #include<string> #include<vector> using namespace std; int main() { int num; cin>>num; //num is the number of telephone numbers to be read string line; vector<string> numlist; getline(cin,line); //为什么这里一定要加一行getline, 不加的话numlist第一个元素总是空字串 for(int i=1;i<=num;i++) { getline(cin,line); numlist.push_back(line); } return 0; } 在这里小白先谢谢各位大神前辈了
leetcode169求众数编译不过
## 题目如下 给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在众数。 示例 1: 输入: [3,2,3] 输出: 3 示例 2: 输入: [2,2,1,1,1,2,2] 输出: 2 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ## 我的代码在vs上编译通过且有正确结果 但是oj上编译出错 错误信息 solution.cpp: In member function majorityElement Line 17: Char 32: error: control reaches end of non-void function [-Werror=return-type] vector<pair<int, int>> list; ^~~~ cc1plus: some warnings being treated as errors ## 代码如下 class Solution { public: int majorityElement(vector<int>& nums) { vector<pair<int, int>> list; for (auto a : nums) { bool has = false; for (int b = 0; b<list.size();b++) { if (list[b].first == a) { list[b].second+=1; has = true; } } if(has==false) { list.push_back(make_pair(a, 1)); } has = false; } for (auto b : list) { if (b.second > nums.size()/2) return b.first; } } };
有没有大神能指点一下哪里错了。。。。
package Frame; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.*; import javax.swing.*; import db.DButil; public class login extends JFrame implements ActionListener{ private JPanel jp=new JPanel(); //创建标签数组 private JLabel[] jlArray={new JLabel("用户名"), new JLabel("密 码"),new JLabel("")}; private JButton jb1; private JButton jb2; private JButton jb3; private JTextField jtf=new JTextField(); private JPasswordField jpf=new JPasswordField(); //布局构造实现方法 public login(){ Icon icon1=new ImageIcon("login.jpg"); Icon icon2=new ImageIcon("reset.jpg"); Icon icon3=new ImageIcon("zhuce.jpg"); JPanel jp=new JPanel(){ protected void paintComponent(Graphics g) { ImageIcon icon = new ImageIcon("bg.jpg"); Image img = icon.getImage(); g.drawImage(img, 0, 0, icon.getIconWidth(), icon.getIconHeight(), icon.getImageObserver()); }}; jp.setLayout(null); jb1=new JButton(icon1); jb2=new JButton(icon3); jb3=new JButton(icon2); jlArray[0].setBounds(70,120,90,32); jb1.setBounds(365,110,130,60); jb2.setBounds(365,170,130,60); jlArray[1].setBounds(70,170,90,32); //将标签与按钮添加到JPanel容器中 jp.add(jlArray[0]); jp.add(jlArray[1]); jp.add(jb1); jp.add(jb2); jb1.addActionListener(this); jb2.addActionListener(this);//为按钮注册动作事件监听器 //添加修改密码的按钮 jb3.setBounds(365,230,130,60); jp.add(jb3); jp.add(jtf); jtf.setBounds(140,120,180,30);//设置文本框位置 jp.add(jpf); jpf.setBounds(140,170,180,30);//设置密码框位置 jpf.setEchoChar('*'); //密码显示字符形式 jpf.addActionListener(this); //为密码框注册动作事件监听器 this.setVisible(true);//设置窗体的可见性 jpf.addActionListener(this); //为密码框注册动作事件监听器 //设置用于显示登陆状态的标签大小位置,并将其添加进JPanel容器 jlArray[2].setBounds(70,220,300,30); jp.add(jlArray[2]); this.setTitle("登陆");//设置窗体标题 this.setBounds(450,200,500,318);//设置窗体的大小 this.setResizable(false);//设置窗体不让用户调整大小 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.setVisible(true);//设置窗体的可见性 this.add(jp);//将窗体添加到面板中 jp.setBackground(Color.blue); } public static void main(String[] args) { new login();//创建登陆窗体 } public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub //得到用户名与密码 String user=jtf.getText().trim(); String pwd=String.valueOf(jpf.getPassword());//返回密码的字符串表示方式 String sql=""; if(e.getSource()==jtf){//事件源为文本框,切换焦点到密码框 jpf.requestFocus(); } else if(e.getSource()==jb1||e.getSource()==jpf){ //判断用户名和密码是否匹配 查询数据库 if(DButil.check(user, pwd)){ //登陆成功 MainFrame mf=new MainFrame(jtf.getText());//主窗体 this.dispose(); } else{ //登陆失败 jlArray[2].setText("对不起,非法的用户名和密码"); this.clear(); } } else if(e.getSource()==jb2) {//事件源为注册按钮 if(user.equals("")||pwd.equals("")) {//如果注册的用户名为空或者密码为空 jlArray[2].setText("用户名和密码都不得为空!!!"); this.clear();//清空输入文本框 } else { sql="select uid from user where uid='"+user+"'"; if(DButil.isExist(sql)) {//用户名已经存在 jlArray[2].setText("对不起,用户名已存在!!!"); this.clear();//清空输入文本框 } else { sql="insert into user values('"+user+"','"+pwd+"')"; if(DButil.update(sql)>0) {//注册成功 jlArray[2].setText("恭喜您!!!注册成功,请登陆"); } } } } else if(e.getSource()==jb3)//修改密码的监听 { //判断是否已经输入用户名和密码 if(user.equals("")||pwd.equals("")) { jlArray[2].setText("修改密码先输入正确的用户名和密码!!!"); this.clear();//清空输入文本框 } //判断是否输入了正确的用户名和密码 else if(DButil.check(user,pwd)) { //正确的用户名和密码 String password=JOptionPane.showInputDialog(this,"修改密码:","请输入新密码", JOptionPane.PLAIN_MESSAGE); //得到新的密码为空 if(password==null||password.equals("")) { JOptionPane.showMessageDialog(this,"密码不得为空!!!","错误", JOptionPane.WARNING_MESSAGE); } else {//密码不为空 sql="update user set pwd='"+password+"' where uid='"+user+"'";//更新密码的SQL if(DButil.update(sql)>0) {//密码修改成功 this.clear();//清空输入文本框 jlArray[2].setText("恭喜您!!!密码修改成功,请用新密码登陆"); } } } else { JOptionPane.showMessageDialog(this,"用户名或者密码错误!!!","错误", JOptionPane.WARNING_MESSAGE); this.clear();//清空输入文本框 } } } package Frame; import javax.swing.*; import javax.swing.table.DefaultTableModel; import db.DButil; import java.awt.*; import java.awt.event.*; import java.sql.*; import java.io.*; import java.util.*; public class MainFrame extends JFrame implements ActionListener,ItemListener { private String uname=null;//当前用户的名字 private boolean isInsert=false;//是否为添加默认为否 private JPanel topjp=new JPanel();//界面上半部分的JPanel容器 private JButton jba=new JButton("模糊查询"); private JButton jbs=new JButton("查找"); private JTextField jtfs=new JTextField();//按给出信息查找联系人信息 private JRadioButton jrbxm=new JRadioButton("按姓名查找",true); private JRadioButton jrbbh=new JRadioButton("按学号查找",false); private ButtonGroup bg=new ButtonGroup();//单选按钮组 private JPanel jpbr=new JPanel();//单选按钮面板 private JPanel jpyInfo=new JPanel();//右侧显示个人信息的面板 private JTextArea jta=new JTextArea(); // 模糊查询得到的信息文本区 private JLabel[] jlInfo={new JLabel("学号:"),new JLabel("姓名:"), new JLabel("性别:"),new JLabel("出生日期:"), new JLabel("电话号码:"),new JLabel("QQ:"), new JLabel("Email:"),new JLabel("地址:"), new JLabel("添加相片")}; private JButton[] jbInfo={new JButton("编辑"),new JButton("保存"), new JButton("浏览"), new JButton("上传"),}; private JLabel jlPhoto=new JLabel();//显示图像的JLabel控件 private JTextField[] jtfInfo=new JTextField[10]; private JTextField jtfPhoto=new JTextField();//添加照片到相册的路径 private JFileChooser jfcPic=new JFileChooser();//上传图像的文件选择器 private DefaultTableModel tableModel; private JTable table; //性别部分 private JRadioButton jrbMale=new JRadioButton("男",true); private JRadioButton jrbFemale=new JRadioButton("女"); private ButtonGroup bgGender=new ButtonGroup(); private JPanel jpGender=new JPanel();//单选按钮面板 private JLabel jlDetail=new JLabel();//右侧显示一幅图片的标签 private JSplitPane jspOuter=//上下分割的JSplitPane new JSplitPane(JSplitPane.VERTICAL_SPLIT,true); //系统托盘部分 private PopupMenu popup=new PopupMenu(); private SystemTray tray;//定义SystemTray成员变量 private TrayIcon trayIcon;//定义TrayIcon成员变量 private MenuItem exit=new MenuItem("退出程序");//定义菜单 public void initJps() {//界面上半部分的初始化 topjp.setLayout(null);//设置topjp布局管理器为null //设置按钮大小并添加到JPanel面板里 jba.setBounds(5,10,120,26); jba.addActionListener(this);//为模糊查询按钮注册事件监听器 topjp.add(jba); jbs.setBounds(130,10,80,26); jbs.addActionListener(this);//为查找按钮注册事件监听器 topjp.add(jbs);//添加按钮到topjp面板里 //设置jtfs文本框大小并添加到jps面板里 jtfs.setBounds(215,10,120,26); jtfs.addActionListener(this);//为文本框注册事件监听器 topjp.add(jtfs); //设置单选按钮大小和位置并添加到jpbr面板里同时添加到bg单选按钮组里 jrbxm.setBounds(5,3,50,26); jrbxm.addItemListener(this);//为单选按钮注册ItemEvent事件监听器 bg.add(jrbxm); jpbr.add(jrbxm); jrbbh.setBounds(60,3,50,26); jrbbh.addItemListener(this); bg.add(jrbbh); jpbr.add(jrbbh); jpbr.setBounds(360,10,200,26); topjp.add(jpbr); } public void initInfo() {//初始化信息界面 jpyInfo.setLayout(null);//设置布局管理器为空 jpyInfo.setBounds(50,50,380,360);//设置信息面板的大小和位置 jlPhoto.setBounds(220,10,150,170);//设置联系人图像JLabel的大小和位置 jlPhoto.setBorder(BorderFactory.createLineBorder(Color.BLACK));//将JLbel的边框线显现出来 jpyInfo.add(jlPhoto);//将显示联系人照片的JLabel添加到信息面板 tableModel=new DefaultTableModel(); Vector vector1 = new Vector(); DButil db = new DButil(); vector1.add("学号"); vector1.add("姓名"); vector1.add("性别"); vector1.add("出生日期"); vector1.add("电话号码"); vector1.add("QQ"); vector1.add("Email"); vector1.add("地址"); vector1.add("照片路径"); tableModel.setDataVector(null, vector1); System.out.print(123); table=new JTable(tableModel); //table.addMouseListener((MouseListener) this); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); JScrollPane js=new JScrollPane(table); //添加相片部分的控件 jtfPhoto.setBounds(80,250,200,26);//设置得到照片路径的文本框的大小和位置 jpyInfo.add(jtfPhoto);//将得到照片路径的文本框添加到信息面板 jbInfo[2].setBounds(285,250,80,26); jbInfo[2].addActionListener(this);//为添加照片的浏览按钮注册事件监听器 jpyInfo.add(jbInfo[2]); //上传按钮 jbInfo[3].setBounds(380,250,80,26); jbInfo[3].addActionListener(this);//为添加照片的浏览按钮注册事件监听器 jpyInfo.add(jbInfo[3]); for(int i=0;i<9;i++)//添加JLabel,并设置大小和位置 { jlInfo[i].setBounds(20,10+i*30,60,26); jpyInfo.add(jlInfo[i]); } for(int i=0;i<10;i++) {//初始化一些文本框 jtfInfo[i]=new JTextField(); } //学号 jtfInfo[0].setBounds(80,10,135,26); jpyInfo.add(jtfInfo[0]); //姓名 jtfInfo[1].setBounds(80,40,135,26); jpyInfo.add(jtfInfo[1]); //出生日期 jtfInfo[3].setBounds(80,100,135,26); jpyInfo.add(jtfInfo[3]); //电话号码 jtfInfo[4].setBounds(80,130,135,26); jpyInfo.add(jtfInfo[4]); //QQ jtfInfo[5].setBounds(80,160,135,26); jpyInfo.add(jtfInfo[5]); //Email jtfInfo[6].setBounds(80,190,135,26); jpyInfo.add(jtfInfo[6]); //地址文本框的添加 jtfInfo[7].setBounds(80,220,285,26); jpyInfo.add(jtfInfo[7]); //模糊查询信息文本区的添加 js.setBounds(0,350,600,100); jpyInfo.add(js); //编辑、保存按钮 jbInfo[0].setBounds(160,300,80,26); jbInfo[0].addActionListener(this); jpyInfo.add(jbInfo[0]); jbInfo[1].setBounds(260,300,80,26); jbInfo[1].addActionListener(this); jpyInfo.add(jbInfo[1]); //性别部分 jrbMale.setBounds(5,3,50,26); jrbMale.addItemListener(this); //为单选按钮注册ItemEvent事件监听器 bgGender.add(jrbMale); jpGender.add(jrbMale); jrbFemale.setBounds(60,3,50,26); jrbFemale.addItemListener(this); //为单选按钮注册ItemEvent事件监听器 bgGender.add(jrbFemale); jpGender.add(jrbFemale); jpGender.setBounds(60,70,125,26); jpyInfo.add(jpGender); } public void clearInfo()//清空信息面板 { for(int i=0;i<10;i++) { jtfInfo[i].setText("");//清空文本框 } jlPhoto.setIcon(null);//清空图像 } public void setjtaArea(String information){ if(information.isEmpty()){ JOptionPane.showMessageDialog(this,"所查用户不存在!!!","错误", JOptionPane.WARNING_MESSAGE); } else { jta.setText(information); } } public void setInfo(Vector<String> pInfo)//将信息向量设置到信息面板中 {//将信息向量按规则填到信息面板里 this.clearInfo(); if(pInfo.size()==0) { JOptionPane.showMessageDialog(this,"所查用户不存在!!!","错误", JOptionPane.WARNING_MESSAGE); } else { for(int i=0;i<2;i++) {//显示联系人编号和姓名 jtfInfo[i].setText(pInfo.get(i)); } if(pInfo.get(2).equals("男")) {//显示性别 jrbMale.setSelected(true); } else {//显示性别 jrbFemale.setSelected(true); } for(int i=3;i<9;i++) {//显示出生日期、电话号码和QQ jtfInfo[i].setText(pInfo.get(i)); } } } public Vector<String> getInfo()//从信息面板得到用户输入的信息 { Vector<String> pInfo=new Vector<String>(); pInfo.add(jtfInfo[0].getText().trim());//添加pid pInfo.add(jtfInfo[1].getText().trim());//添加pname String gender=jrbMale.isSelected()?"男":"女"; pInfo.add(gender);//添加性别 pInfo.add(jtfInfo[3].getText().trim());//出生日期 pInfo.add(jtfInfo[4].getText().trim());//电话号码 pInfo.add(jtfInfo[5].getText().trim());//QQ pInfo.add(jtfInfo[6].getText().trim());//Email pInfo.add(jtfInfo[7].getText().trim());//地址 String photoPath=jtfPhoto.getText().trim();//得到照片路径 pInfo.add(photoPath);//照片路径 return pInfo; } public void monitorSaveButton() //监听保存按钮的方法 { String sql=""; String pid=jtfInfo[0].getText().trim();//得到联系人的编号 String pname=jtfInfo[1].getText().trim();//得到联系人的姓名 String gender=jrbMale.isSelected()?"男":"女"; String s1=jtfInfo[3].getText().trim(); String s2=jtfInfo[4].getText().trim(); String s3=jtfInfo[5].getText().trim(); String s4=jtfInfo[6].getText().trim(); String s5=jtfInfo[7].getText().trim(); String s6=jtfPhoto.getText().trim(); String sqla="select * from contacts where pid='"+pid+"'";//判断此编号是否存在的SQL String sqlb="select * from contacts where pname='"+pname+"'";//判断此姓名是否存在的SQL boolean isIdExist=DButil.isExist(sqla);//得到编号是否存在 boolean isNameExist=DButil.isExist(sqlb);//得到姓名是否存在 if(!(pid.equals(" ")||pname.equals(" "))) { if(isIdExist||isNameExist){ JOptionPane.showMessageDialog(this,"联系人已存在"+ " , 添加联系人失败","错误",JOptionPane.WARNING_MESSAGE); } else { sql="insert into contacts values (?,?,?,?,?,?,?,?,?,?)"; String[] paras={pid,pname,gender,s1,s2,s3,s4,s5,s6,null}; if(DButil.update(sql,paras)>0){ JOptionPane.showMessageDialog(this,"联系人保存成功","提示", JOptionPane.INFORMATION_MESSAGE); } } } } public void setEditable(boolean Editable)//设置信息窗口是否可编辑 { jrbFemale.setEnabled(Editable);//设置性别是否可编辑 jrbMale.setEnabled(Editable);//设置性别是否可编辑 for(int i=0;i<8;i++) { jtfInfo[i].setEditable(Editable);//设置文本框是否可编辑 } } public void monitorSearchButton()//监听查找按钮的方法 { String name=jtfs.getText().trim(); String sql="";//声明查找字符串 if(name.equals("")) { JOptionPane.showMessageDialog(this,"查找条件不能为空!!!", "错误", JOptionPane.WARNING_MESSAGE); } else { if(jrbxm.isSelected()==true) {//按姓名查找 sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where pname='"+name+"'"; this.setInfo(DButil.getPerInfo(sql));//设置信息面板为该联系人的信息 } else {//按编号查找 sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where pid='"+name+"'"; this.setInfo(DButil.getPerInfo(sql));//设置信息面板为该联系人的信息 } } this.setEditable(false);//设置面板不可编辑 } public void monitorRandomSearchButton(String information){ //监听模糊查询按钮 String adress=jba.getText().trim(); String sql="";//声明查找字符串 if(adress.equals("")) { JOptionPane.showMessageDialog(this,"查找条件不能为空!!!", "错误", JOptionPane.WARNING_MESSAGE); } else{ sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where padress like '%天河区%'"; } } public MainFrame(String uname) { //主窗体构造器 this.uname=uname;//设置用户名 this.initJps();//界面上半部分的搭建 this.initInfo(); jspOuter.setDividerLocation(46);//设置分割窗体JSplitPane的位置 jspOuter.setTopComponent(topjp);//设置窗体上半部分的控件 jspOuter.setBottomComponent(jpyInfo);//设置下半部分的控件 //设置窗体关闭按钮执行的动作 this.add(jspOuter); this.addWindowListener( new WindowAdapter() { @SuppressWarnings("deprecation") public void WindowClosing(WindowEvent e) { //将窗体隐藏 MainFrame.this.hide(); } } ); //设置主窗体的图标、标题、大小以及可见性 this.setResizable(false);//设置窗体不让调整大小 this.setTitle(uname+"的通讯录"); this.setBounds(420,80,618,550); this.setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getSource()==jbInfo[1]) {//保存按钮的监听 this.monitorSaveButton(); } else if(e.getSource()==jba) {//模糊查询按钮的监听 DButil db = new DButil(); Vector vector1 = new Vector(); vector1.add("学号"); vector1.add("姓名"); vector1.add("性别"); vector1.add("出生日期"); vector1.add("电话号码"); vector1.add("QQ"); vector1.add("Email"); vector1.add("地址"); vector1.add("照片路径"); String ad = jtfs.getText().trim(); tableModel.setDataVector(db.getData(ad),vector1); } else if(e.getSource()==jbInfo[2]) {//打开图像文件路径 jfcPic.showOpenDialog(this); if(jfcPic.getSelectedFile()!=null) { jtfPhoto.setText(""+jfcPic.getSelectedFile()); } } else if(e.getSource()==jbInfo[0]) {//编辑按钮的监听 this.setEditable(true);//设置信息面板可编辑 } else if(e.getSource()==jbs||e.getSource()==jtfs) {//查找,按按钮或者在文本框里敲回车 this.monitorSearchButton(); } } public void itemStateChanged(ItemEvent e) { } public static void main(String[] args){ } } package db; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import java.util.Vector; public class DButil { private static String jdbcName="org.gjt.mm.mysql.Driver";//声明驱动类字符串 //声明数据库连接字符串 private static String dbUrl="jdbc:mysql://127.0.0.1:3306/maillist"; private static String dbUserName="root"; private static String dbPassword="admin"; private static Connection con=null;//声明数据库连接对象引用 private static Statement stat=null;//声明语句对象引用 private static PreparedStatement pstmt=null; private static ResultSet rs=null;//声明结果集对象引用 private static PreparedStatement psInsert=null;//声明预编译语句对象引用 public static Connection getConnection()//得到数据库连接的方法 { System.out.println("连接中.."); try { Class.forName(jdbcName);//加载驱动类 con=DriverManager.getConnection(dbUrl,dbUserName,dbPassword);//得到连接 System.out.println("成功连接"); } catch(Exception e){e.printStackTrace();} return con;//返回连接 } public static boolean check(String user,String pwd)//登陆验证 { boolean flag=false; try { con=DButil.getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery("select pwd from user where uid='"+user+"'"); rs.next(); String spwd=rs.getString(1);//得到密码 if(spwd.equals(pwd)) { flag=true;//密码匹配,登陆成功 } } catch(Exception e) { flag=false;//有任何异常发生,登陆失败 } finally{DButil.closeCon();}//关闭数据库连接 return flag; } //某条记录是否存在 public static boolean isExist(String sql) { boolean flag=false;//设置返回值 try { con=DButil.getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery(sql);//执行查询 if(rs.next()) { flag=true;//存在,设置返回值为true } } catch(Exception e) { e.printStackTrace(); flag=false;//发生任何异常,置返回结果为false } finally{DButil.closeCon();}//关闭数据库连接 return flag;//返回结果 } public static int update(String sql,String[] paras)//更新数据库 { int count=0;//声明返回值 try { con=DButil.getConnection(); pstmt=con.prepareStatement(sql); for(int i=0; i<paras.length;i++){ pstmt.setString(i+1, paras[i]); } count=pstmt.executeUpdate(); } catch(Exception e) { e.printStackTrace(); count=-1;//更新失败返回值为-1 } finally{DButil.closeCon();}//关闭数据库连接 return count;//返回结果 } public static int update(String sql)//更新数据库 { int count=0;//声明返回值 try { con=DButil.getConnection(); stat=con.createStatement(); count=stat.executeUpdate(sql);//执行更新 } catch(Exception e) { e.printStackTrace(); count=-1;//更新失败返回值为-1 } finally{DButil.closeCon();}//关闭数据库连接 return count;//返回结果 } //====================添加联系人================================= public static String insertPerson(String uid,Vector<String> pInfo) { String isPathNull="isNotNull";//传过来的图像是不是合法,默认不为空 try{ con=getConnection();//得到数据库连接 if(pInfo.get(8).equals("")||pInfo.get(8)==null) {//照片路径为空,则不插入图像 psInsert=con.prepareStatement("insert into contacts(pid,pname,pgender,pbirthday,pnumber,"+ "pQQ,pemail,padress,uid)"+ "values(?,?,?,?,?,?,?,?,?)"); } else {//照片路径不为空,则插入图像 psInsert=con.prepareStatement("insert into contacts(pid,pname,pgender,pbirthday,pnumber,"+ "pQQ,pemail,padress,pphoto,uid)"+ "values(?,?,?,?,?,?,?,?,?,?,?)" ); File f=new File(pInfo.get(8));//获取选取的图片文件 byte[] b=new byte[(int)f.length()];//创建存储图片数据的数组 FileInputStream fin=new FileInputStream(f); fin.read(b);fin.close();//读取文件存于byte数组中并关闭输入流 psInsert.setBytes(11,b);//设置pphoto参数的数据 } for(int i=0;i<8;i++) {//设置公共信息 psInsert.setString(i+1,pInfo.get(i)); } psInsert.setString(10,uid);//所属用户 psInsert.execute();psInsert.close();//执行更新并关闭语句 } catch(FileNotFoundException fnfe){isPathNull="isNull";}//图片路径不对 catch(Exception e){e.printStackTrace();} finally{DButil.closeCon();}//关闭数据库连接 return isPathNull; } public static String updatePerson(String uid,Vector<String> pInfo){ String isPathNull="isNotNull";//传过来的path是不是合法 try{ con=getConnection(); if(pInfo.get(9).equals("")||pInfo.get(9)==null) {//更新时候,如果照片路径为空,则不更新图像 psInsert=con.prepareStatement("update contacts set pname=?,pgender=?,birthday=?,pnumber=?,"+ "pQQ=?,pemail=?,padress=?,pphoto=?,uid=? where pid='"+pInfo.get(0).trim()+"'"); } else {//如果照片路径不为空,则更新图像 psInsert=con.prepareStatement("update contacts set pname=?,pgender=?,page=?,pnumber=?,"+ "pemail=?,pgroup=?,ppostalcode=?,padress=?,uid=?,pphoto=? where pid='"+pInfo.get(0).trim()+"'"); File f=new File(pInfo.get(9));//获取选取的图片文件 byte[] b=new byte[(int)f.length()];//创建存储图片数据的数组 FileInputStream fin=new FileInputStream(f); fin.read(b);fin.close();//读取文件存于byte数组中并关闭输入流 psInsert.setBytes(10,b); } for(int i=1;i<8;i++){//设置公共的信息部分 psInsert.setString(i,pInfo.get(i)); } psInsert.setString(9,uid);//所属用户 psInsert.execute();psInsert.close();//执行更新并关闭语句 } catch(FileNotFoundException fnfe){isPathNull="isNull";}//路径不合法 catch(Exception e){e.printStackTrace();} finally{DButil.closeCon();}//关闭连接 return isPathNull; } public Vector getData(String ad){ Vector vector=new Vector(); try { //陈述对象 con=getConnection();//得到数据库连接 stat=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);//创建语句对象 rs=stat.executeQuery("select * from contacts where padress LIKE '%"+ad+"%'"); ResultSetMetaData rm=rs.getMetaData(); //循环打印出数据库表中数据 int n=rm.getColumnCount(); while(rs.next()){ Vector ve=new Vector(); for(int i=1;i<n+1;i++){ String s=rs.getString(i); ve.add(s); } vector.add(ve);//Vector对象接收表中数据 } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{if(rs!=null){ try { rs.close();//关闭结果集 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stat!=null){ try { stat.close();//关闭陈述对象 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(con!=null){ try { con.close();//关闭连接 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return vector; } public static Vector<String> getPerInfo(String sql)//得到联系人信息 { Vector<String> pInfo=new Vector<String>(); try { con=getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery(sql);//执行查询 while(rs.next()) { for(int i=1;i<10;i++) { System.out.println(rs.getString(i)); pInfo.add(rs.getString(i));//将联系人信息添加到返回向量 } } } catch(Exception e) { e.printStackTrace(); } finally{DButil.closeCon();}//关闭数据库连接 return pInfo;//返回信息集合 } public static void closeCon()//关闭数据库连接的方法 { try { if(rs!=null){rs.close(); rs=null;}//如果结果集不为空关闭结果集并赋值null if(stat!=null){stat.close(); stat=null;}//如果语句对象不为空关闭语句对象并赋值null if(con!=null){con.close(); con=null;}//如果连接不为空关闭连接并赋值null } catch(Exception e){e.printStackTrace();} } public static void main(String[] args){ DButil DB=new DButil(); System.out.println(DB.getConnection()); } } }
c++ 用decltype定义的问题
#include <iostream> #include <string> #include <iterator> #include <vector> using namespace std; int main() { string input = " cmp txt1 txt2 end"; vector<string> vec; decltype(vec.size()) index = 0; for (; index < input.size() && input[index] == ' '; ++index);//index停在第一个非空格的字符上 if (index >= input.size()) { cout << "错误!输入内容为空\n"; return -1; } ... ``` ``` 断点显示进入for语句时index为“未定义标识符”,然后连if条件都没判断就退出了,想问问为什么
2017-09-02CCFCSP公共钥匙盒
想请教一下为什么如下代码只能得10分 试题编号: 201709-2 试题名称: 公共钥匙盒 时间限制: 1.0s 内存限制: 256.0MB 问题描述   有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家。每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒中。   钥匙盒一共有N个挂钩,从左到右排成一排,用来挂N个教室的钥匙。一串钥匙没有固定的悬挂位置,但钥匙上有标识,所以老师们不会弄混钥匙。   每次取钥匙的时候,老师们都会找到自己所需要的钥匙将其取走,而不会移动其他钥匙。每次还钥匙的时候,还钥匙的老师会找到最左边的空的挂钩,将钥匙挂在这个挂钩上。如果有多位老师还钥匙,则他们按钥匙编号从小到大的顺序还。如果同一时刻既有老师还钥匙又有老师取钥匙,则老师们会先将钥匙全还回去再取出。   今天开始的时候钥匙是按编号从小到大的顺序放在钥匙盒里的。有K位老师要上课,给出每位老师所需要的钥匙、开始上课的时间和上课的时长,假设下课时间就是还钥匙时间,请问最终钥匙盒里面钥匙的顺序是怎样的? 输入格式   输入的第一行包含两个整数N, K。   接下来K行,每行三个整数w, s, c,分别表示一位老师要使用的钥匙编号、开始上课的时间和上课的时长。可能有多位老师使用同一把钥匙,但是老师使用钥匙的时间不会重叠。   保证输入数据满足输入格式,你不用检查数据合法性。 输出格式   输出一行,包含N个整数,相邻整数间用一个空格分隔,依次表示每个挂钩上挂的钥匙编号。 样例输入 5 2 4 3 3 2 2 7 样例输出 1 4 3 2 5 样例说明   第一位老师从时刻3开始使用4号教室的钥匙,使用3单位时间,所以在时刻6还钥匙。第二位老师从时刻2开始使用钥匙,使用7单位时间,所以在时刻9还钥匙。   每个关键时刻后的钥匙状态如下(X表示空):   时刻2后为1X345;   时刻3后为1X3X5;   时刻6后为143X5;   时刻9后为14325。 样例输入 5 7 1 1 14 3 3 12 1 15 12 2 7 20 3 18 12 4 21 19 5 30 9 样例输出 1 2 3 5 4 评测用例规模与约定   对于30%的评测用例,1 ≤ N, K ≤ 10, 1 ≤ w ≤ N, 1 ≤ s, c ≤ 30;   对于60%的评测用例,1 ≤ N, K ≤ 50,1 ≤ w ≤ N,1 ≤ s ≤ 300,1 ≤ c ≤ 50;   对于所有评测用例,1 ≤ N, K ≤ 1000,1 ≤ w ≤ N,1 ≤ s ≤ 10000,1 ≤ c ≤ 100。 ``` #include <iostream> #include<vector> #include<algorithm> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int const N=10010; struct Sendt{ int num; int stt; }st[N]; struct Backt{ int num; int btt; }bt[N]; bool cmps(Sendt a,Sendt b){ if(a.stt!=b.stt){ return a.stt<b.stt; } else{ return a.num<b.num; } } bool cmpb(Backt a,Backt b){ if(a.btt!=b.btt){ return a.btt<b.btt; }else{ return a.num<b.num; } } int box[N]; int main(int argc, char** argv) { int n,k; int num,s,u,b; cin>>n>>k; for(int i=1;i<=n;i++){ box[i-1]=i; } for(int i=0;i<k;i++){ cin>>num>>s>>u; b=s+u; st[i].num=num; st[i].stt=s; bt[i].num=num; bt[i].btt=b; } sort(st,st+k,cmps); sort(bt,bt+k,cmpb); for(int i=0;i<k;i++){ for(int j=n-1;j>=0;j--){ if(st[i].num==box[j]){ box[j]=0; //cout<<st[i].num<<" "<<j<<" "<<box[j]<<"*"<<endl; break; } } for(int m=0;m<n;m++){ if(box[m]==0){ box[m]=bt[i].num; //cout<<bt[i].num<<" "<<m<<" "<<box[m]<<"s"<<endl; break; } } } for(int i=0;i<n;i++){ cout<<box[i]<<" "; } cout<<endl; return 0; } ```
关于C++ 单例模式的double-check的疑问。
最近在学习单例模式,在了解频繁加锁会造成资源的浪费的前提下,通常做法时使用 双重检查的机制来解决资源浪费。于是我做了以下测试: ```c++ #include <unistd.h> #include <pthread.h> #include <iostream> #include <vector> #include <sys/time.h> using namespace std; pthread_mutex_t lo; class Singleton { public: static Singleton * p_instance; static Singleton * GetInstance(); private: Singleton(){cout<<"Contructor running"<<endl;} }; Singleton * Singleton::p_instance=NULL; Singleton * Singleton::GetInstance() { if(p_instance==NULL) { pthread_mutex_lock(&lo); if(p_instance==NULL) p_instance=new Singleton(); pthread_mutex_unlock(&lo); } pthread_mutex_unlock(&lo); return p_instance; } void * fun(void *) { Singleton::GetInstance(); } int main() { //cout<<&lo<<endl; pthread_mutex_init(&lo,NULL); vector<pthread_t *> thread_pool; for(int i=0;i<10000000;i++) { pthread_t * pth = new pthread_t; thread_pool.push_back(pth); } //calculate time duration struct timeval t1,t2; double duration=0; gettimeofday(&t1,NULL); for(int i=0;i<thread_pool.size();i++) { pthread_create(thread_pool[i],NULL,fun,NULL); } for(int i=0;i<thread_pool.size();i++) pthread_join(*thread_pool[i],NULL); gettimeofday(&t2,NULL); duration = t2.tv_sec - t1.tv_sec + (t2.tv_usec - t1.tv_usec)/1000000.0; cout<<duration<<endl; return 0; } ``` 结果在ubuntu18.04中测试耗时:14.907s 然后我将程序中的,第一个判空去掉,就像这样: ```c++ Singleton * Singleton::GetInstance() { //if(p_instance==NULL) //{ pthread_mutex_lock(&lo); if(p_instance==NULL) p_instance=new Singleton(); // pthread_mutex_unlock(&lo); //} pthread_mutex_unlock(&lo); return p_instance; } ``` 同样地,进行了多次返回的结果是: ``` Contructor running 18.1153 me@ubuntu:~/Desktop/pocesstet$ ./app Contructor running 14.9578 me@ubuntu:~/Desktop/pocesstet$ ./app Contructor running 14.8444 me@ubuntu:~/Desktop/pocesstet$ ./app Contructor running 14.3856 ``` 时间时间甚至比使用双重检查(double check)的效果要好?这是为什么? 是我哪里理解错了吗?先谢谢各位了!
VS2013,C++,error LNK2019和LNK1120
output:1>------ Build started: Project: chapter5 使用序列式容器并分析字符串, Configuration: Debug Win32 ------ 1> Source.cpp 1>Source.obj : error LNK2019: unresolved external symbol "class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > __cdecl split(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?split@@YA?AV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@AAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) referenced in function _main 1>C:\Users\cc\Desktop\Accelerated C++\exercise\chapter5 使用序列式容器并分析字符串\Debug\chapter5 使用序列式容器并分析字符串.exe : fatal error LNK1120: 1 unresolved externals ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== split.cpp: > //使用索引实现的split函数 #include <string> #include <vector> #include <iostream> #include <cctype> using namespace std; vector<string> split(const string &s) { vector<string> ret; typedef string::size_type string_size; string_size i = 0; while (i != s.size()) { while (i != s.size() && isspace(s[i])) ++i; string_size j = i; while (j != s.size() && !isspace(s[j])) ++j; if (i != j) { ret.push_back(s.substr(i, j - i)); i = j; } } return ret; } ===== split.h: > #ifndef GUARD_split_h #define GUARD_split_h #include <vector> #include <string> std::vector<std::string> split(std::string &s); #endif ===== Source.cpp > #include "split.h" #include <iostream> #include <string> #include <vector> #include <iterator> using namespace std; int main() { string s; while (getline(cin, s)) { vector<string> v = split(s); for (vector<string>::size_type i = 0; i != v.size(); ++i) cout << v[i] << endl; } return 0; } ====== 我用的是空项目建立的,搞不懂是为什么出问题了,新手啊
void的函数调用完后再return时出现了错误
//本函数用于---- - 利用新加入EP的解去更新信息素矩阵 //tau:cell变量含有K个信息素矩阵,newinEP记录新加入EP的编号 //g保存的是所有objectives对应的g值,gmin是g中最小的 #include"HEAD.h" int Tau_update2(vector<vector<vector<double> > > &tau, double(*wets)[M], vector<int>newinEP, vector<vector<double> >chroms) { double weights[colonysize][M]; for (int i = 0; i < colonysize; ++i) for (int j = 0; j < M; ++j) weights[i][j] = wets[i][j]; int size = chroms.size(); vector<vector<double> > temp; for (int i = 0; i < chroms.size(); ++i) { vector<double> temp_temp; for (int j = 0; j < M; ++j) temp_temp.push_back(chroms[i][N + j]); temp.push_back(temp_temp); temp_temp.erase(temp_temp.begin(),temp_temp.end()); } vector<double> g; vector<vector<double> >weigh; for (int i = 0; i < size; ++i) { vector<double> f(weights[i],weights[i]+M); weigh.push_back(f); f.erase(f.begin(), f.end()); } evaluate_g(temp, weigh, g); weigh.clear(); vector<vector<double> >().swap(weigh); double min_g = *min_element(g.begin(), g.end()); gmin = min(min_g, gmin); int num_newinEP = newinEP.size(); vector<double> w1(N, 0); vector<vector<double> >w; for (int i = 0; i < N; ++i) w.push_back(w1); w1.clear(); vector<double>().swap(w1); double tau_max = (double)(num_newinEP + 1) / ((1 - Rho)*(1 + gmin)); double tau_min = tau_max / (2 * N); Delta = 0.05*tau_max; double f[K][N][N]; for (int k1 = 0; k1 < K; ++k1) for (int i1 = 0; i1 < N; ++i1) for (int j1 = 0; j1 < N; ++j1) f[k1][i1][j1] = tau[k1][i1][j1]*Rho; for (int i = 0; i < num_newinEP; ++i) { int group_index = ceil((double)(newinEP[i] * K) / colonysize); for (int j = 0; j < N; ++j) { int m = (int)chroms[newinEP[i]][j]; w[j][m] = 1; } double t = 1 / (1 + g[newinEP[i]]); for (int k = 0; k < N; ++k) for (int l = 0; l < N; ++l) { f[group_index][k][l] += (w[k][l]+w[l][k]) * t; } } //MAX-MIN for (int j2 = 0; j2 < K; ++j2) { for (int k2= 0; k2 < N; ++k2) for (int l2 = 0; l2 < N; ++l2) { if (f[j2][k2][l2]>tau_max) f[j2][k2][l2] = tau_max; if (f[j2][k2][l2] < tau_min) f[j2][k2][l2] = tau_min; } } for (int k3 = 0; k3 < K; ++k3) for (int i3 = 0; i3 < N; ++i3) for (int j3 = 0; j3< N; ++j3) tau[k3][i3][j3] = f[k3][i3][j3]; return 0; } ``` ``` 其中K=5,colonysize=50,N=62 ![图片说明](https://img-ask.csdn.net/upload/201510/27/1445876509_510972.png) 在中断时指向到95行的return语句上。 为什么会出现这种情况,在哪出现错误? 查百度是说指向空指针,可为什么没发现? 求大神指教
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截
本篇文章主要讲解 token、session 等用户认证方案的区别并分析常见误区,以及如何通过前后端的配合实现完善的访问拦截,为下一步权限控制的实现打下基础。
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在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最贱实践
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
漫话:什么是平衡(AVL)树?这应该是把AVL树讲的最好的文章了
这篇文章通过对话的形式,由浅入深带你读懂 AVL 树,看完让你保证理解 AVL 树的各种操作,如果觉得不错,别吝啬你的赞哦。 1、若它的左子树不为空,则左子树上所有的节点值都小于它的根节点值。 2、若它的右子树不为空,则右子树上所有的节点值均大于它的根节点值。 3、它的左右子树也分别可以充当为二叉查找树。 例如: 例如,我现在想要查找数值为14的节点。由于二叉查找树的特性,我们可...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了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 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
《C++ Primer》学习笔记(六):C++模块设计——函数
专栏C++学习笔记 《C++ Primer》学习笔记/习题答案 总目录 https://blog.csdn.net/TeFuirnever/article/details/100700212 —————————————————————————————————————————————————————— 《C++ Primer》习题参考答案:第6章 - C++模块设计——函数 文章目录专栏C+...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车?某胡同口的煎饼摊一年能卖出多少个煎饼?深圳有多少个产品经理?一辆公交车里能装下多少个乒乓球?一个正常成年人有多少根头发?这类估算问题,被称为费米问题,是以科学家费米命名的。为什么面试会问这种问题呢?这类问题能把两类人清楚地区分出来。一类是具有文科思维的人,擅长赞叹和模糊想象,它主要依靠的是人的第一反应和直觉,比如小孩...
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。 背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法 不过,当我看了源代码之后 这程序不到50行 尽管我有多年的Python经验,但我竟然一时也没有看懂 当然啦,原作者也说了,这个代码也是在无聊中诞生的,平时撸码是不写中文变量名的, 中文...
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的回答,对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalking,作者吴晟、刘浩杨 等等 仓库地址: apache/skywalking 更...
相关热词 c# 输入ip c# 乱码 报表 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件
立即提问