关于vector的erase,不知道为什么会错

std::vector >::iterator iter = vertex.erase(vertex.begin() + indexVertex[x]);//indexVertex[x]就是一个整数,运行时是2

调试的时候,vertex大小为8,删除了第n个元素,测试了好几个,都会导致最后一个元素,也就是最后一个HeadNode结构中的指针变量的值修改为不可知的一个值。
下面是结构体的定义
struct MatricNode
{
int ID;//结点ID
MatricNode * next;
MatricNode(int i){ID = i;next = nullptr;}
};

//图的顶点的定义,邻接矩阵中的头结点
template
struct HeadNode
{
int ID;//结点的id
T data;//结点的信息
MatricNode *next;//下一个结点
HeadNode(int id,T d){ID = id;data = d; next = nullptr;}
~HeadNode()
{
MatricNode *p,*q;
p = next;
while(p != nullptr)
{
q = p -> next;
delete p;
p = q;
}
}
};

2个回答

我解决的办法,就是在删除前,最后push_back 一下
删除完成以后在pop_back一下,这样就没有问题了,但是我还是不能理解 为什么会出现上面的情况,vector中最后一个结构会出现问题,前面的都不会

erase 可以用什么代替。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于vector的insert 、 erase、resize操作导致迭代器无效化
typedef vector<int>int_vec; int_vec v(2,0); int_vec::iterator iter_b = v.begin(); v.insert(v.begin(),1); cout<<*iter_b<<endl; //这种操作会导致iter_b无效,输出随机值 但是: int_vec v1(2,0); int_vec::iterator iter_b = v.begin(); v.erase(v.begin()); cout<<*iter_b<<endl; //却能正常输出当前vector内的第一个元素,求解释 同时: 如果insert和erase依次进行操作,事先初始化的迭代器也不会被无效化,求解释
C++ 嵌套vector中使用erase,没有真正删除元素
数据放在一个嵌套的vector里,我需要找到内层vector的特定元素然后删掉。但是我发现没有真的删掉,还是能访问到。为什么呢 ``` bool LayerDic::remove(CString IdCStr) { vector<vector<Data>>::iterator group2 = resDataGroup.begin(); while ((group2) != resDataGroup.end()) { vector<Data>::iterator it = (*group2).begin(); while ((it) != (*group2).end()) { if (it->getIdCStr().Compare(IdCStr) == 0) { (*group2).erase(it); temp();//为了验证是否真的删除 return true; } } } return false; } void LayerDic::temp() { vector<vector<Data>>::iterator group2 = resDataGroup.begin(); while ((group2) != resDataGroup.end()) { vector<Data>::iterator it = (*group2).begin(); while ((it) != (*group2).end()) { CString cs = it->getIdCStr(); it++; } group2++; } } ```
C++ 不存在从“std::vector<char,std::allocator<char>>" 到char* 的适当转换函数/E0413/C2664
我想把一个字符串vector数组转化为char型vector二维数组,在倒数第二行会出现如题目上说的问题 ``` #include<iostream> #include<vector> #include<string> using namespace std; int main() { int n; cin >> n; vector<string>arr(n); for (int i = 0; i < n; i++) { cin >> arr[i]; string::iterator it; for (it = arr[i].begin(); it != arr[i].end(); it++) { if (*it == '-') { arr[i].erase(it); //STL erase函数 it--; } } } vector<vector<char>>arr1(n,vector<char>(7)); for (int i = 0; i < n; i++) { //arr1[i].data = arr[i]; strcpy(**arr**1[i], arr[i].c_str()); } ```
c++ 迭代器 erase之后出了问题,已解决,但不知道我错误的原因
我在做一道贪心算法的练习题,其中一部分是为了遍历vector,然后把里面符合要求的部分删除,但是却报了奇怪的错误。我稍微改了一下,错误解决了,但我搞不清楚错误的原因。希望有大神能给我一些建议。 不要网上的答案,我只要针对我这个具体问题的错误原因。 出错的部分: ``` vector<struct dianshi>::iterator it2 = ds.begin(); while (it2 != ds.end()) { //外面的大循环进行到第三轮,在这里报错了 if (it2!=min_it&& (*it2).start_time < min) { it2 = ds.erase(it2);//删除元素,返回值指向已删除元素的下一个位置 } else { it2++; } } ds.erase(min_it); } ``` 测试用例: ``` 12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 ``` 下面是两个源代码 错误的代码: ``` #include<iostream> #include<vector> #include<iterator> using namespace std; struct dianshi { int start_time, end_time; }; int main() { int num; while (cin >> num&&num!=0) { int cnt = 0; vector<struct dianshi> ds; while (num--) { struct dianshi a; cin >> a.start_time >> a.end_time; ds.push_back(a); } while (!ds.empty()) { cnt++; int min = ds.front().end_time; vector<struct dianshi>::iterator min_it = ds.begin(); //找到那个结束时间最早的 for (vector<struct dianshi>::iterator it = ds.begin(); it != ds.end(); it++) { if ((*it).end_time < min) { min = (*it).end_time; min_it = it; } } //删除开始时间比这个结束时间早的所有。 vector<struct dianshi>::iterator it2 = ds.begin(); while (it2 != ds.end()) { //外面的大循环进行到第三轮,在这里报错了 if (it2!=min_it&& (*it2).start_time < min) { it2 = ds.erase(it2);//删除元素,返回值指向已删除元素的下一个位置 } else { it2++; } } ds.erase(min_it); } cout << cnt; } system("pause"); } ``` 改正后的代码 ``` #include<iostream> #include<vector> #include<iterator> using namespace std; struct dianshi { int start_time, end_time; }; int main() { int num; while (cin >> num&&num!=0) { int cnt = 0; vector<struct dianshi> ds; while (num--) { struct dianshi a; cin >> a.start_time >> a.end_time; ds.push_back(a); } while (!ds.empty()) { cnt++; int min = ds.front().end_time; vector<struct dianshi>::iterator min_it = ds.begin(); //找到那个结束时间最早的 for (vector<struct dianshi>::iterator it = ds.begin(); it != ds.end(); it++) { if ((*it).end_time < min) { min = (*it).end_time; min_it = it; } } //删除开始时间比这个结束时间早的所有。 ds.erase(min_it); vector<struct dianshi>::iterator it2 = ds.begin(); while ( it2 != ds.end()) { if ((*it2).start_time < min) { it2 = ds.erase(it2);//删除元素,返回值指向已删除元素的下一个位置 } else { it2++; } } //ds.erase(min_it); } cout << cnt; } system("pause"); } ```
c++ stl使用erase什么时候会崩溃
it里面的成员对象可以取到值(string类型),但是在擦除的时候崩溃了,没有用 it=vec.erase(it)这种形式,it++也没写在for里面,请问是什么情况导致的? 附言:断点执行到vec.erase(it)的时候再按F11就崩 上个代码方便看问题: void class::Delete(string lpName) { std::vector<structX>::iterator it = m_structList.begin(); for(;it != m_structList.end();) { if(it->Name == lpName) { it = m_structList.erase(it); continue; } ++it; } } 这个是删除容器元素的方法,没添加这个之前不会崩溃 程序功能是元素使用完后要被删除,所以下面这个也是删除的功能,先执行完上面这个,再执行下面这个: try { for(;it != m_structList.end();) { str = it->Name;//此处Name可以取到值 if(it->MsgRet == -1) { it = m_structList.erase(it); continue; } if(LUA_YIELD != it->ret ) { it = m_structList.erase(it);//在name可以取到值的时候,断点到这里F11崩溃 continue; } ++it; } } catch( ... ) { }
小白求问:编译报错 undefined reference to 如何解决
//头文件 #ifndef SLINKLIST_H #define SLINKLIST_H template <class elemType> class list { public: virtual void clear() = 0; virtual int length()const = 0; virtual void insert(int i, const elemType& x) = 0; virtual void remove(int i) = 0; virtual void traverse()const = 0; virtual ~list() {}; }; template<class elemType> class sLinkList :public list <elemType> { private: struct node{ elemType data; node* next, * tail; node(const elemType& x, node* n = nullptr) { data = x; next = n; } node() :next(nullptr) {} ~node() {} }; node* head; node* tail; int currentLength; node* move(int i)const; public: sLinkList(); ~sLinkList() {clear(); delete head; delete tail; } void clear(); int length()const { return currentLength; } void insert(int i, const elemType &x); void remove(int i); void traverse()const; void erase(const elemType &x, const elemType &y); }; #endif //实现文件 #include "sLinkList.h" #include <iostream> using namespace std; template<class elemType> typename sLinkList<elemType>::node* sLinkList<elemType>::move(int i)const { node* p = head; while (i-- >= 0) p = p->next; return p; } template<class elemType> sLinkList<elemType>::sLinkList() { head = new node; tail = new node; head->next = tail; currentLength = 0; } template<class elemType> void sLinkList<elemType>::clear() { node* p = head->next, * q; head->next = nullptr; while (p != tail) { q = p->next; delete p; p = q; } currentLength = 0; } template<class elemType> void sLinkList<elemType>::insert(int i, const elemType &x) { node* pos; pos = move(i - 1); pos->next = new node(x, pos->next); ++currentLength; } template<class elemType> void sLinkList<elemType>::remove(int i) { node* pos, * delp; pos = move(i - 1); delp = pos->next; pos->next = delp->next; delete delp; --currentLength; } template<class elemType> void sLinkList<elemType>::erase(const elemType &x, const elemType &y) { node* p; int i = 0; p = head; while (p->next!=tail) { if (p->next->data >= x && p->next->data <= y) remove(i); else { p = p->next; i++; } } } template<class elemType> void sLinkList<elemType>::traverse()const { node* p = head->next; cout << endl; while (p != tail) { cout << p->data << " "; p = p->next; } cout << endl; } //主函数 #include "sLinkList.h" #include <vector> #include <iostream> using namespace std; int main() { sLinkList<int> s; vector<int> v; int tmp,x,y; while (cin >> tmp) { v.push_back(tmp); if (getchar() == '\n') break; } for (unsigned int i = 0; i < v.size(); i++) { s.insert(i, v[i]); } cin >> x >> y; s.erase(x, y); s.length(); s.traverse(); return 0; }
用vector删除二位数组的元素
#include <iostream> #include <algorithm> #include <vector> #include <cstdio> #include <string> #define M 1000 using namespace std; int N,L,H; vector<int>peo[M]; vector<int>whole; int main(int argc, char** argv) { int i,j,z=0; int num[3]; cin>>N>>L>>H; for(i=0;i<N;i++){ cin>>num[0]>>num[1]>>num[2]; peo[i].push_back(num[0]); peo[i].push_back(num[1]); peo[i].push_back(num[2]); } for(i=0;i<N;i++){ if(peo[i][1]<L){ cout<<i<<endl; cout<<peo[i][0]<<endl; peo[i].erase(peo[i][0]); cout<<peo[i][0]<<endl; //cout<< ++z; } } return 0; } 1.我想问一下能用erase删除一整行的数据么 2.然后vector 里的size 的含义是当前行的大小还是有多少行的意思?如果我想动态的知道自己的数据有多少行该怎么办 3.在运行时程序出错了,也不知道为什么 [Error] no matching function for call to 'std::vector<int>::erase(std::vector<int>&)' 求大神帮助,谢谢
c++中vector的iterator问题,srase()函数
代码如下,删除之后为什么报错 #include <iostream> #include <vector> using namespace std; int main(){ vector<int> a; vector<int>::iterator t1, t2,t; a.push_back(1); a.push_back(2); a.push_back(3); t1 = a.begin(), t2 = a.end()-2; while (t1 != t2){ t = t1; if (*t1 == 1) a.erase(t); cout << "t1" << " "; t1++; } return 0; }
关于STL vector的遍历问题,请问怎样一边操作一边遍历删除?
#include<stdio.h> #include<vector> #include<iostream> #include <pthread.h> #include <unistd.h> using namespace std; typedef struct rect { int id; int length; int width; }Rect; vector<Rect> vec; void * add(void *argc) { int i; Rect r; while(1){ sleep(1); for(i=0;i<10;i++){ r.id=i; r.length=i; r.width=i; vec.push_back(r); } } return NULL; } void * delete4(void *argc){ while(1){ vector<Rect>::iterator it=vec.begin(); for(it=vec.begin(); it!=vec.end();) { if(it->id== 4) { //将it赋值为erase()的返回值,它指向the new location of the element that followed the last element erased vec.erase(it); } else ++it; } } return NULL; } int main() { pthread_t tidp1; pthread_t tidp2; pthread_create(&tidp1,NULL,add,NULL); pthread_create(&tidp2,NULL,delete4,NULL); while(1){ sleep(2); vector<Rect>::iterator it=vec.begin(); for(it=vec.begin(); it!=vec.end(); ++it) cout<<it->id<<endl; } return 0; } ``` ```
vector类型静态成员变量 overflow的问题
#include<iostream> #include<vector> #include<iterator> using namespace std; class CMyClass { public: CMyClass(){} CMyClass(int a) { this->m_nValue = a; vec.push_back(*this); } ~CMyClass() { /*不知道怎么指向当前类*/ vector<CMyClass>::iterator it; for (it = vec.begin(); it != vec.end(); it++) { if (it->vec == *this) vec.erase(it); } //int length = vec.size(); //for (int i = 0; i < length; i++) //{ // if (&vec[i] == this) // { // CMyClass temp = vec[i]; // // } /* }*/ //for (it=vec.begin(); it != vec.end(); it++) //{ // if (vec[]) // vec.erase(it); //} //cout << "delete d" << endl; } friend bool operator==(vector<CMyClass>v, CMyClass& c2) { int length = v.size(); for (int i = 0; i < length; i++) { if (&v[i] == &c2) return true; } return false; } friend ostream& operator<<(ostream& out, CMyClass& c) { out << c.m_nValue << endl; return out; } static void ShowList() { vector<CMyClass>::iterator it; for (it = vec.begin(); it != vec.end(); it++) { cout << *it; } } private: int m_nValue; static vector<CMyClass>vec; }; vector<CMyClass>CMyClass::vec; int main() { CMyClass a(100); CMyClass b(1); CMyClass c; CMyClass* d = new CMyClass; *d = 10; cout << "The first end:" << endl; CMyClass::ShowList(); if (1) { CMyClass e(1000); cout << "The second end:" << endl; CMyClass::ShowList(); } delete d; cout << "The third end:" << endl; CMyClass::ShowList(); return 0; } 类里的vector类型静态成员变量,目的是创建新对象时把它加入到容器中,析构时反之 现在出现overflow的问题
可以建立map< vector<string>, set <string> >这样的map么
血型遗传对照表如下: ![图片说明](https://img-ask.csdn.net/upload/201809/12/1536758027_359603.jpg) ``` #include <iostream> #include <string> #include <vector> #include <map> #include <set> using namespace std; map <vector <string>, set <string> > mp;//建立输入血型vector, 与输出可能会出现血型set之间联系的map string f, m;//双方血型读取 vector <string> i; //建立输入血型vector set <string> o;//可能会出现血型set set <string> un;//不可能会出现血型set map <vector <string>, set <string> > unmp;//建立输入血型vector, 与不可能会出现血型set之间联系的map void table() { //将全部血型输入不可能会出现血型un这一set,当输出任意可能出现血型,使用erase()将un这一set里的该血型擦除 un.insert("AB"); un.insert("A"); un.insert("B"); un.insert("O"); //应该把f, m放到打表法里面么 if (f != "AB" || m != "AB") { o.insert("O"); un.erase("O"); o.insert(f); un.erase(f); o.insert(m); un.erase(m); } if ( (f == "A" && m == "B") || (f == "B" && m == "A")) { o.insert("AB"); o.insert("A"); o.insert("B"); un.erase("AB"); un.erase("A"); un.erase("B"); } if ( (f == "AB" && m != "O") || (m == "AB" && f!= "O")) { o.insert("A"); o.insert("B"); o.insert("AB"); un.erase("AB"); un.erase("A"); un.erase("B"); } if ( (f == "AB" && m == "O") || (m == "AB" && f == "O") ) { o.insert("A"); o.insert("B"); un.erase("A"); un.erase("B"); } mp[i] = o; unmp[i] = un; } int main() { /*********************************************** string f, m; vector <string> v; cin >> f >> m;//这样读会读入',' ************************************************/ table(); string str; cin >> str; string a = ""; string b = ""; int bstart = 0; for (int z = 0; z < str.length(); z++) { while (str[z] != ',') { a += str[z]; } if (str[z] == ',') { bstart = z; } } for (int z = bstart; z < str.length(); z++) { b+= str[z]; } i.push_back(a); i.push_back(b); set <string> tempi; set <string> tempo; for (auto it = mp.begin(); it != mp.end(); it++)//注意这一句的写法auto it = .begin(); it != .end(); it++ { tempi = *it; for (int i = 0; i < tempi.size(); i++) { if (i == 0) { cout << tempi[i]; } else { cout << "," << tempi[i]; } } } for (auto it = unmp.begin(); it != unmp.end(); it++)//注意这一句的写法auto it = .begin(); it != .end(); it++ { tempo = *it; for (int i = 0; i < tempo.size(); i++) { if (i == 0) { cout << tempo[i]; } else { cout << "," << tempo[i]; } } } } ``` 请实现一个程序,输入父母血型,判断孩子可能的血型。 给定两个字符串father和mother,代表父母的血型,请返回一个字符串数组,代表孩子的可能血型(按照字典序排列)。 测试样例: ”A”,”A” 返回:[”A”,“O”]
一个简单的C++练习,运行时显示“vector iteration incompatible"。
array<int, 11> ar = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 }; vector<int> vec(ar.begin(), ar.end()); auto it = vec.begin(); while (it != vec.end()) { if (*it % 2) vec.erase(it); else it++; } for (auto i : vec) cout << i;
vector有关unique以及sort
算法原题:给定一个整数数组和一个整数k,你需要找到数组中的独特k-diff对数。这里的k-diff对定义为一个整数对(i,j),其中i和j是数组中的绝对差异数K。 问题在k为0时,我打算用sort、unique将前面的非重复部分erase掉,但在实现时发现{-1,-1,-1, 0, 1, 3}执行过后就变成了{-1, 0, 1, 3,1,3},是否跟内存分配有关? #include<iostream> #include<vector> #include <algorithm> using namespace std; int findPairs(vector<int>& nums, int k) { sort(nums.begin(), nums.end()); for (vector<int>::iterator it = nums.begin(); it != nums.end(); ++it){ cout << "-1第:" << *it << endl; } int num = 0; if (k == 0){ unique(nums.begin(), nums.end()); for (vector<int>::iterator it= nums.begin(); it!=nums.end();++it){ cout << "0第:" << *it << endl; } sort(nums.begin(), nums.end()); for (int number = 0; number < nums.size(); number++){ cout << "1第" << number << ":" << nums[number] << endl; } nums.erase(nums.begin(), unique(nums.begin(), nums.end())); for (int number = 0; number < nums.size(); number++){ cout << "2第"<<number<<":"<<nums[number]<< endl; } nums.erase(unique(nums.begin(), nums.end()), nums.end()); num = nums.size(); return num; } nums.erase(unique(nums.begin(), nums.end()),nums.end()); int size = nums.size(); for (int i = 0; i < size - 1; i++){ for (int j = size - 1; j >i; j--){ if (nums[j] - nums[i] == k){ num++; } } } return num; } int main(){ vector<int> nums = { -1,-1,-1, 0, 1, 3 }; cout << findPairs(nums,0) << endl; system("pause"); } 程序结果图![图片说明](https://img-ask.csdn.net/upload/201803/07/1520385945_788426.png) ```
为什么我看了这个关于高校人员信息管理系统设计的代码运行时总是会说找不到“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; }
C++ VECTOR push_back 出现stack_overflow
#include<iostream> #include<vector> #include<iterator> using namespace std; class CMyClass { public: CMyClass() {} CMyClass(int a) { this->m_nValue = a; vec.push_back(*this); } CMyClass(const CMyClass&c) { m_nValue = c.m_nValue; } ~CMyClass() { /*不知道怎么指向当前类*/ vector<CMyClass>::iterator it; for (it = vec.begin(); it != vec.end(); it++) { if (it->vec == *this) vec.erase(it); } } friend bool operator==(vector<CMyClass>v, CMyClass& c2) { int length = v.size(); for (int i = 0; i < length; i++) { if (&v[i] == &c2) return true; } return false; } friend ostream& operator<<(ostream& out, CMyClass& c) { out << c.m_nValue << endl; return out; } static void ShowList() { vector<CMyClass>::iterator it; for (it = vec.begin(); it != vec.end(); it++) { cout << *it; } } private: int m_nValue; static vector<CMyClass>vec; }; vector<CMyClass>CMyClass::vec; int main() { CMyClass a(100); CMyClass b(1); CMyClass c; CMyClass* d = new CMyClass; *d = 10; cout << "The first end:" << endl; CMyClass::ShowList(); if (1) { CMyClass e(1000); cout << "The second end:" << endl; CMyClass::ShowList(); } delete d; cout << "The third end:" << endl; CMyClass::ShowList(); return 0; } 类CMyClass中的vector类型的静态成员变量,目的是在创建对象时把他加入到容器中,在析构对象时把它从该容器中删除。现在debug,出现了overflow的错误,求教!
c++, vector subscript out of range 哪里有问题?
``` #include<iostream> #include<vector> #include<unordered_map> #include<algorithm> using namespace std; class Solution { public: vector<vector<int>> For4Sum(vector<int> &nums,int target) { vector<vector<int>> result; unordered_map<int,vector<pair<int,int>>> map; sort(nums.begin(), nums.end()); if (nums.size() < 4) return result; for (int i = 0; i < nums.size()-1; i++) { for (int j = i + 1; j < nums.size(); i++) { map[nums[i]+nums[j]].push_back(pair<int,int>(i,j)); } } for (int i = 0; i < nums.size() - 1; i++) { for (int j = 0; j < nums.size(); i++) { int key = target - nums[i] - nums[j]; if (map.find(key) != map.end()) { for (int k = 0; k < map[key].size(); k++) { if (i < map[key][k].first) { result.push_back({ nums[i], nums[j], nums[map[key][k].first],nums[map[key][k].second] }); } } } } } sort(result.begin(), result.end()); result.erase(unique(result.begin(),result.end()),result.end()); return result; } }; int main() { Solution a; vector<int> test; int target; int temp = 0; cout << "input target" << endl; cin >> target; cout << "input nums" << endl; while (cin >> temp) {//ctrl+z test.push_back(temp); } vector<vector<int>> result; result=a.For4Sum(test, target); for (int i = 0; i < result.size(); i++) { for (int j = 0; j < result[i].size(); j++) cout << result[i][j] << " " << endl; cout << endl; } system("pause"); return 0; } ```
关于ccf 2015年12月份 第四题的提点疑问,求大佬解答
下面的是这个题目,应该就是一个一个关于欧拉通路的题目我感觉分为两步: 1.判断是不是欧拉通路 2.如果是欧拉通路,找到end点 3.从1开始找最小权重路径 感觉逻辑应该是对的,代码用了几组数据测试也是对的,但是最后提交了只有10分,很尴尬,求大佬帮忙看看哪里有问题 下面是题目: ![图片说明](https://img-ask.csdn.net/upload/201910/18/1571379365_609151.jpg) ![图片说明](https://img-ask.csdn.net/upload/201910/18/1571379421_849560.jpg) ![图片说明](https://img-ask.csdn.net/upload/201910/18/1571379446_582377.jpg) 下面是我的代码(c++) ``` --c++ #include<iostream> #include<vector> #include<algorithm> using namespace std; struct Node { int myself; vector<int> road_to; }; int Min(vector<int> V) { int min=V[0]; for(int n=1;n<V.size();n++) if(V[n]<min) min=V[n]; return min; } //从1开始遍历,每次寻找都是没走过的/下一个节点最小的路径 void Dsf(Node *N,int end) { int next=0;Node node=N[1]; while(node.myself!=end||node.road_to.size()!=0) { cout<<node.myself<<' '; next=Min(node.road_to); //删去这条路径(表示已经遍历过) vector<int>::iterator iter=find(N[node.myself].road_to.begin(),N[node.myself].road_to.end(),next); N[node.myself].road_to.erase(iter); iter=find(N[next].road_to.begin(),N[next].road_to.end(),node.myself); N[next].road_to.erase(iter); node=N[next]; } cout<<end; } int main() { int node_num=0,road_num=0; cin>>node_num>>road_num; node_num++; Node *N=new Node[node_num]; for(int n=1;n<node_num;n++) N[n].myself=n; for(int n=0;n<road_num;n++) { int tem1=0,tem2=0; cin>>tem1>>tem2; N[tem1].road_to.push_back(tem2); N[tem2].road_to.push_back(tem1); } //看看除了1还有几个奇度数的节点(1若是奇数,flag必须为1,1若是偶数,flag必须为0,end初始化为1) int flag=0,end=1; for(int n=1;n<node_num;n++) { if(N[n].road_to.size()%2!=0&&n!=1) { flag++;end=n; } } //判断是都是欧拉通路 if(!(flag==1&&N[1].road_to.size()%2!=0)&&!(flag==0&&N[1].road_to.size()%2==0)) { cout<<-1; return 0; } //寻找最短路径 Dsf(N,end); return 0; } ```
stl里面.h文件有一些函数定义,但是实现不在里面,如何找到这些函数的实现?
比如vector里面的_M_fill_insert,rb_tree里面的_rb_tree_rebalance_for_erase
迷宫问题的代码看不懂了,求大佬注释
为啥要这么定义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; } ```
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载 点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
介绍几个可以下载编程电子书籍的网站。 1.Github Github上编程书资源很多,你可以根据类型和语言去搜索。推荐几个热门的: free-programming-books-zh_CN:58K 星的GitHub,编程语言、WEB、函数、大数据、操作系统、在线课程、数据库相关书籍应有尽有,共有几百本。 Go语言高级编程:涵盖CGO,Go汇编语言,RPC实现,Protobuf插件实现,Web框架实...
小白学 Python 爬虫(25):爬取股票信息
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
《面试宝典》2019年springmvc面试高频题(java)
前言 2019即将过去,伴随我们即将迎来的又是新的一年,过完春节,马上又要迎来新的金三银四面试季。那么,作为程序猿的你,是否真的有所准备的呢,亦或是安于本职工作,继续做好手头上的事情。 当然,不论选择如何,假如你真的准备在之后的金三银四跳槽的话,那么作为一个Java工程师,就不可不看了。如何在几个月的时间里,快速的为即将到来的面试进行充分的准备呢? 1、什么是Spring MVC ?简单...
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
(总结)阿里面试问了ArrayList,都问了啥?
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
2020年1月中国编程语言排行榜,python是2019增长最快编程语言
编程语言比例 排名 编程语言 最低工资 工资中位数 最低工资 最高工资 人头 人头百分比 1 rust 20713 17500 5042 46250 480 0.14% 2 typescript 18503 22500 6000 30000 1821 0.52% 3 lua 18150 17500 5250 35000 2956 0.84% 4 go 17989 16...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
工作十年的数据分析师被炒,没有方向,你根本躲不过中年危机
2020年刚刚开始,就意味着离职潮高峰的到来,我身边就有不少人拿着年终奖离职了,而最让我感到意外的,是一位工作十年的数据分析师也离职了,不同于别人的主动辞职,他是被公司炒掉的。 很多人都说数据分析是个好饭碗,工作不累薪资高、入门简单又好学。然而今年34的他,却真正尝到了中年危机的滋味,平时也有不少人都会私信问我: 数据分析师也有中年危机吗?跟程序员一样是吃青春饭的吗?该怎么保证自己不被公司淘汰...
立即提问