STL-queue/map

本文深入解析了C++ STL中优先队列(大根堆、小根堆)的定义与使用,以及Map容器的特性、访问方式和常用函数。通过实例展示了如何在程序中有效运用这些数据结构。
priority_queue
  1. 尝试定义一个大根堆
priority_queue <int> q;
priority_queue <int,vector<int>,less<int> > q; 
  1. 尝试定义一个小根堆
priority_queue <int,vector<int>,greater<int> > xq;

map

首先map就是一种映射。

map<typename1,typename2> mp;//typename1叫做键,typename2叫做值
  1. map的访问
map<char,int> mp;
mp['c']=1;
for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++)
it->first('c')  it->second(1)
  1. 常用函数
	map<char,int> mp;
	mp['c']=1;
	mp['d']=2;
	
	mp.count('c') => 1
	mp.count('e') => 0	

	map<char,int>::iterator it=mp.find('c');  \\O(logn) 
	if(it!=mp.end()) cout<<it->second<<endl;
	//找到该键所对应的值

	cout<<mp.size()<<endl;  \\ O(1)
	//求size    

	map<char,int> mp;
	mp['c']=1;
	mp['d']=2;
	mp['e']=33;
	map<char,int>::iterator it=mp.find('c');
	mp.erase(it);                                  <=>mp.erase('c');        \\O(logn)

	mp.clear();   \\ O(n)
这个是完整源码 python实现 Flask,Vue 【python毕业设计】基于Python的Flask+Vue物业管理系统 源码+论文+sql脚本 完整版 数据库是mysql 本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语和软件开发平台,依据需求分析开展控制模块制做和数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试和性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语和软件开发平台,依据需求分析开展控制模块制做和数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试和性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语和软件开发平台,依据需求分析开展控制模块制做和数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试和性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发
14 C:\Users\admin\Documents\未命名5.cpp [Warning] ignoring '#pragma comment ' [-Wunknown-pragmas] C:\Users\admin\Documents\未命名5.cpp In member function 'void Snake::Move(bool)': 64 16 C:\Users\admin\Documents\未命名5.cpp [Warning] enumeration value 'STOP' not handled in switch [-Wswitch] C:\Users\admin\Documents\未命名5.cpp In member function 'bool Snake::Contains(const Point&) const': 76 29 C:\Users\admin\Documents\未命名5.cpp [Error] 'const class std::queue<Point>' has no member named 'begin' 76 49 C:\Users\admin\Documents\未命名5.cpp [Error] 'const class std::queue<Point>' has no member named 'end' C:\Users\admin\Documents\未命名5.cpp In constructor 'Game::Game(const string&)': 95 12 C:\Users\admin\Documents\未命名5.cpp [Warning] 'Game::role' will be initialized after [-Wreorder] 94 10 C:\Users\admin\Documents\未命名5.cpp [Warning] 'bool Game::running' [-Wreorder] 98 5 C:\Users\admin\Documents\未命名5.cpp [Warning] when initialized here [-Wreorder] C:\Users\admin\Documents\未命名5.cpp In member function 'void Game::UpdateMap()': 131 31 C:\Users\admin\Documents\未命名5.cpp [Error] no matching function for call to 'begin(std::queue<Point>&)' 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/algorithmfwd.h In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/algorithmfwd.h 60 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/stl_algo.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/stl_algo.h 52 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 90 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/initializer_list [Note] candidate: 'template<class _Tp> constexpr const _Tp* std::begin(std::initializer_list<_Tp>)' 90 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/initializer_list [Note] template argument deduction/substitution failed: 131 31 C:\Users\admin\Documents\未命名5.cpp [Note] 'std::queue<Point>' is not derived from 'std::initializer_list<_Tp>' 54 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 51 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Container> constexpr decltype (__cont.begin()) std::begin(_Container&)' 51 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h In substitution of 'template<class _Container> constexpr decltype (__cont.begin()) std::begin(_Container&) [with _Container = std::queue<Point>]': 131 31 C:\Users\admin\Documents\未命名5.cpp required from here 51 50 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Error] 'class std::queue<Point>' has no member named 'begin' 61 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Container> constexpr decltype (__cont.begin()) std::begin(const _Container&)' 61 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h In substitution of 'template<class _Container> constexpr decltype (__cont.begin()) std::begin(const _Container&) [with _Container = std::queue<Point>]': 131 31 C:\Users\admin\Documents\未命名5.cpp required from here 61 56 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Error] 'const class std::queue<Point>' has no member named 'begin' 90 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Tp, unsigned int _Nm> constexpr _Tp* std::begin(_Tp (&)[_Nm])' 90 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: 131 31 C:\Users\admin\Documents\未命名5.cpp [Note] mismatched types '_Tp [_Nm]' and 'std::queue<Point>' 54 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 107 31 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Tp> _Tp* std::begin(std::valarray<_Tp>&)' 107 31 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: 131 31 C:\Users\admin\Documents\未命名5.cpp [Note] 'std::queue<Point>' is not derived from 'std::valarray<_Tp>' 54 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 108 37 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Tp> const _Tp* std::begin(const std::valarray<_Tp>&)' 108 37 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: 131 31 C:\Users\admin\Documents\未命名5.cpp [Note] 'std::queue<Point>' is not derived from 'const std::valarray<_Tp>' 131 31 C:\Users\admin\Documents\未命名5.cpp [Error] no matching function for call to 'end(std::queue<Point>&)' 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/algorithmfwd.h In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/algorithmfwd.h 60 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/stl_algo.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/stl_algo.h 52 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 101 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/initializer_list [Note] candidate: 'template<class _Tp> constexpr const _Tp* std::end(std::initializer_list<_Tp>)' 101 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/initializer_list [Note] template argument deduction/substitution failed: 131 31 C:\Users\admin\Documents\未命名5.cpp [Note] 'std::queue<Point>' is not derived from 'std::initializer_list<_Tp>' 54 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 71 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Container> constexpr decltype (__cont.end()) std::end(_Container&)' 71 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h In substitution of 'template<class _Container> constexpr decltype (__cont.end()) std::end(_Container&) [with _Container = std::queue<Point>]': 131 31 C:\Users\admin\Documents\未命名5.cpp required from here 71 48 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Error] 'class std::queue<Point>' has no member named 'end' 81 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Container> constexpr decltype (__cont.end()) std::end(const _Container&)' 81 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h In substitution of 'template<class _Container> constexpr decltype (__cont.end()) std::end(const _Container&) [with _Container = std::queue<Point>]': 131 31 C:\Users\admin\Documents\未命名5.cpp required from here 81 54 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Error] 'const class std::queue<Point>' has no member named 'end' 100 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Tp, unsigned int _Nm> constexpr _Tp* std::end(_Tp (&)[_Nm])' 100 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: 131 31 C:\Users\admin\Documents\未命名5.cpp [Note] mismatched types '_Tp [_Nm]' and 'std::queue<Point>' 54 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 109 31 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Tp> _Tp* std::end(std::valarray<_Tp>&)' 109 31 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: 131 31 C:\Users\admin\Documents\未命名5.cpp [Note] 'std::queue<Point>' is not derived from 'std::valarray<_Tp>' 54 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 110 37 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Tp> const _Tp* std::end(const std::valarray<_Tp>&)' 110 37 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: 131 31 C:\Users\admin\Documents\未命名5.cpp [Note] 'std::queue<Point>' is not derived from 'const std::valarray<_Tp>' 137 31 C:\Users\admin\Documents\未命名5.cpp [Error] no matching function for call to 'begin(std::queue<Point>&)' 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/algorithmfwd.h In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/algorithmfwd.h 60 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/stl_algo.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/stl_algo.h 52 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 90 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/initializer_list [Note] candidate: 'template<class _Tp> constexpr const _Tp* std::begin(std::initializer_list<_Tp>)' 90 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/initializer_list [Note] template argument deduction/substitution failed: 137 31 C:\Users\admin\Documents\未命名5.cpp [Note] 'std::queue<Point>' is not derived from 'std::initializer_list<_Tp>' 54 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 51 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Container> constexpr decltype (__cont.begin()) std::begin(_Container&)' 51 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h In substitution of 'template<class _Container> constexpr decltype (__cont.begin()) std::begin(_Container&) [with _Container = std::queue<Point>]': 137 31 C:\Users\admin\Documents\未命名5.cpp required from here 51 50 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Error] 'class std::queue<Point>' has no member named 'begin' 61 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Container> constexpr decltype (__cont.begin()) std::begin(const _Container&)' 61 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h In substitution of 'template<class _Container> constexpr decltype (__cont.begin()) std::begin(const _Container&) [with _Container = std::queue<Point>]': 137 31 C:\Users\admin\Documents\未命名5.cpp required from here 61 56 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Error] 'const class std::queue<Point>' has no member named 'begin' 90 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Tp, unsigned int _Nm> constexpr _Tp* std::begin(_Tp (&)[_Nm])' 90 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: 137 31 C:\Users\admin\Documents\未命名5.cpp [Note] mismatched types '_Tp [_Nm]' and 'std::queue<Point>' 54 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 107 31 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Tp> _Tp* std::begin(std::valarray<_Tp>&)' 107 31 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: 137 31 C:\Users\admin\Documents\未命名5.cpp [Note] 'std::queue<Point>' is not derived from 'std::valarray<_Tp>' 54 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 108 37 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Tp> const _Tp* std::begin(const std::valarray<_Tp>&)' 108 37 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: 137 31 C:\Users\admin\Documents\未命名5.cpp [Note] 'std::queue<Point>' is not derived from 'const std::valarray<_Tp>' 137 31 C:\Users\admin\Documents\未命名5.cpp [Error] no matching function for call to 'end(std::queue<Point>&)' 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/algorithmfwd.h In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/algorithmfwd.h 60 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/stl_algo.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/stl_algo.h 52 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 101 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/initializer_list [Note] candidate: 'template<class _Tp> constexpr const _Tp* std::end(std::initializer_list<_Tp>)' 101 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/initializer_list [Note] template argument deduction/substitution failed: 137 31 C:\Users\admin\Documents\未命名5.cpp [Note] 'std::queue<Point>' is not derived from 'std::initializer_list<_Tp>' 54 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 71 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Container> constexpr decltype (__cont.end()) std::end(_Container&)' 71 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h In substitution of 'template<class _Container> constexpr decltype (__cont.end()) std::end(_Container&) [with _Container = std::queue<Point>]': 137 31 C:\Users\admin\Documents\未命名5.cpp required from here 71 48 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Error] 'class std::queue<Point>' has no member named 'end' 81 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Container> constexpr decltype (__cont.end()) std::end(const _Container&)' 81 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h In substitution of 'template<class _Container> constexpr decltype (__cont.end()) std::end(const _Container&) [with _Container = std::queue<Point>]': 137 31 C:\Users\admin\Documents\未命名5.cpp required from here 81 54 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Error] 'const class std::queue<Point>' has no member named 'end' 100 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Tp, unsigned int _Nm> constexpr _Tp* std::end(_Tp (&)[_Nm])' 100 5 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: 137 31 C:\Users\admin\Documents\未命名5.cpp [Note] mismatched types '_Tp [_Nm]' and 'std::queue<Point>' 54 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 109 31 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Tp> _Tp* std::end(std::valarray<_Tp>&)' 109 31 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: 137 31 C:\Users\admin\Documents\未命名5.cpp [Note] 'std::queue<Point>' is not derived from 'std::valarray<_Tp>' 54 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string In file included from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/string 40 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/locale_classes.h 41 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/ios_base.h 42 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ios 38 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/ostream 39 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream from C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/iostream 3 C:\Users\admin\Documents\未命名5.cpp from C:\Users\admin\Documents\未命名5.cpp 110 37 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] candidate: 'template<class _Tp> const _Tp* std::end(const std::valarray<_Tp>&)' 110 37 C:/Program Files (x86)/Dev-Cpp/MinGW32/include/c++/10.2.0/bits/range_access.h [Note] template argument deduction/substitution failed: 137 31 C:\Users\admin\Documents\未命名5.cpp [Note] 'std::queue<Point>' is not derived from 'const std::valarray<_Tp>' C:\Users\admin\Documents\未命名5.cpp In lambda function: 198 35 C:\Users\admin\Documents\未命名5.cpp [Error] 'class std::queue<Point>' has no member named 'begin' 198 57 C:\Users\admin\Documents\未命名5.cpp [Error] 'class std::queue<Point>' has no member named 'end' C:\Users\admin\Documents\未命名5.cpp In constructor 'NetworkManager::NetworkManager(Game*, bool)': 340 11 C:\Users\admin\Documents\未命名5.cpp [Warning] 'NetworkManager::game' will be initialized after [-Wreorder] 339 10 C:\Users\admin\Documents\未命名5.cpp [Warning] 'bool NetworkManager::isServer' [-Wreorder] 343 5 C:\Users\admin\Documents\未命名5.cpp [Warning] when initialized here [-Wreorder]
10-02
你的编译器报错信息非常详细,我们来 **逐条分析并修复** 这些错误和警告。主要问题集中在: - `std::queue` 不支持 `begin()` / `end()`(不能用范围 for 循环或 STL 算法直接遍历) - 枚举值 `STOP` 在 `switch` 中未处理 - 成员变量初始化顺序警告 - `#pragma comment(lib, ...)` 在 MinGW/GCC 下不被识别 --- ## ✅ 修复方案总览 我们将对原代码进行以下修改: ### 🔧 1. 修复 `queue<Point>` 没有 `begin/end` 的问题 > ❌ 错误原因:`std::queue` 是适配器,底层是 `deque` 或 `list`,但 **不提供迭代器接口**。 > > ✅ 解决方法:改用 `std::deque<Point>` 或手动复制到临时容器。 我们选择将蛇的身体从 `queue<Point>` 改为 `deque<Point>`,因为: - 仍可高效地在头尾操作(`push_back`, `pop_front`) - 可以使用 `begin()`, `end()` 遍历 - 更适合碰撞检测和渲染 --- ### 🛠️ 2. 修复 `switch` 未处理 `STOP` 在 `Snake::Move()` 函数中使用了 `switch (dir)`,但没有处理 `STOP` 枚举。 --- ### ⚠️ 3. 忽略 `#pragma comment(lib, "ws2_32.lib")` 警告 MinGW 不支持 `#pragma comment`,需手动链接库。 --- ### 🔁 4. 修复成员初始化顺序警告 C++ 成员按声明顺序初始化,而非构造函数列表顺序。 --- ## ✅ 修正后的完整代码(已兼容 MinGW) ```cpp // snake_battle_fixed.cpp #define _WINSOCK_DEPRECATED_NO_WARNINGS #include <iostream> #include <vector> #include <deque> // 替代 queue,支持迭代 #include <string> #include <thread> #include <mutex> #include <atomic> #include <chrono> #include <sstream> #include <winsock2.h> #include <windows.h> // MinGW 不支持 #pragma comment,需在编译时手动链接 -lws2_32 // #pragma comment(lib, "ws2_32.lib") using namespace std; using namespace chrono; const int WIDTH = 60; const int HEIGHT = 30; const char SNAKE1_CHAR = 'O'; const char SNAKE2_CHAR = 'X'; const char FOOD_CHAR = '*'; const int PORT = 8888; enum Direction { STOP = 0, LEFT, RIGHT, UP, DOWN }; struct Point { int x, y; Point(int x = 0, int y = 0) : x(x), y(y) {} bool operator==(const Point& p) const { return x == p.x && y == p.y; } }; class Snake { public: deque<Point> body; // 使用 deque 替代 queue Direction dir; bool alive; int id; Snake(int startX, int startY, int snakeId) : dir(STOP), alive(true), id(snakeId) { body.push_back(Point(startX, startY)); } void ChangeDir(Direction d) { if ((d == LEFT && dir != RIGHT) || (d == RIGHT && dir != LEFT) || (d == UP && dir != DOWN) || (d == DOWN && dir != UP)) { dir = d; } } Point Head() const { return body.back(); } Point Tail() const { return body.front(); } void Move(bool grow = false) { if (!alive || dir == STOP) return; Point head = Head(); Point newHead = head; switch (dir) { case LEFT: newHead.x--; break; case RIGHT: newHead.x++; break; case UP: newHead.y--; break; case DOWN: newHead.y++; break; case STOP: break; // 显式处理 STOP } body.push_back(newHead); if (!grow) body.pop_front(); } bool Contains(const Point& p) const { for (const auto& part : body) // 现在可以 range-based for if (part == p) return true; return false; } }; class Game { private: vector<vector<char>> map; Point food; atomic<bool> foodExists{false}; mutex gameMutex; Snake snake1{10, 15, 1}; Snake snake2{WIDTH - 11, 15, 2}; atomic<Direction> input1{STOP}, input2{STOP}; HANDLE hConsole; string role; bool running; // 注意:必须先声明再初始化 public: Game(const string& r) : role(r), running(true) { // 初始化顺序匹配声明 map.resize(HEIGHT, vector<char>(WIDTH, ' ')); hConsole = GetStdHandle(STD_OUTPUT_HANDLE); GenerateFood(); } void GenerateFood() { lock_guard<mutex> lock(gameMutex); if (foodExists) return; srand(time(nullptr) ^ GetCurrentThreadId()); int x, y; do { x = rand() % (WIDTH - 2) + 1; y = rand() % (HEIGHT - 2) + 1; } while ( snake1.Contains(Point(x, y)) || snake2.Contains(Point(x, y)) ); food = Point(x, y); foodExists = true; map[y][x] = FOOD_CHAR; } void UpdateMap() { lock_guard<mutex> lock(gameMutex); for (int i = 1; i < HEIGHT - 1; ++i) for (int j = 1; j < WIDTH - 1; ++j) map[i][j] = ' '; for (const auto& p : snake1.body) { if (p.x >= 0 && p.x < WIDTH && p.y >= 0 && p.y < HEIGHT) map[p.y][p.x] = SNAKE1_CHAR; } for (const auto& p : snake2.body) { if (p.x >= 0 && p.x < WIDTH && p.y >= 0 && p.y < HEIGHT) map[p.y][p.x] = SNAKE2_CHAR; } if (foodExists) map[food.y][food.x] = FOOD_CHAR; } void Render() { COORD pos = { 0, 0 }; SetConsoleCursorPosition(hConsole, pos); cout << '+' << string(WIDTH - 2, '-') << '+' << endl; for (int i = 1; i < HEIGHT - 1; ++i) { cout << '|'; for (int j = 1; j < WIDTH - 1; ++j) { char c = map[i][j]; if (c == SNAKE1_CHAR) { SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_INTENSITY); } else if (c == SNAKE2_CHAR) { SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY); } else if (c == FOOD_CHAR) { SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); } else { SetConsoleTextAttribute(hConsole, 7); // white } cout << c; } SetConsoleTextAttribute(hConsole, 7); cout << '|' << endl; } cout << '+' << string(WIDTH - 2, '-') << '+' << endl; cout << "Snake1 (Green): WASD | "; cout << "Snake2 (Red): Arrow Keys"; if (role == "server") cout << " [SERVER]"; else cout << " [CLIENT]"; cout << " | Alive: " << (snake1.alive ? "Yes" : "No") << " vs " << (snake2.alive ? "Yes" : "No") << endl; } void CheckCollisions() { Point h1 = snake1.Head(), h2 = snake2.Head(); if (h1.x <= 0 || h1.x >= WIDTH - 1 || h1.y <= 0 || h1.y >= HEIGHT - 1) snake1.alive = false; if (h2.x <= 0 || h2.x >= WIDTH - 1 || h2.y <= 0 || h2.y >= HEIGHT - 1) snake2.alive = false; auto checkSelfCollision = [](const Snake& s) { Point head = s.Head(); int count = 0; for (const auto& p : s.body) if (p == head) count++; return count > 1; }; if (checkSelfCollision(snake1)) snake1.alive = false; if (checkSelfCollision(snake2)) snake2.alive = false; if (snake1.alive && snake2.alive) { if (snake2.Contains(h1) && h1 != snake2.Tail()) snake1.alive = false; if (snake1.Contains(h2) && h2 != snake1.Tail()) snake2.alive = false; } if (foodExists && h1 == food) { foodExists = false; snake1.Move(true); } else if (foodExists && h2 == food) { foodExists = false; snake2.Move(true); } } void InputThread() { while (running) { if (GetAsyncKeyState('A') & 0x8000) input1 = LEFT; else if (GetAsyncKeyState('D') & 0x8000) input1 = RIGHT; else if (GetAsyncKeyState('W') & 0x8000) input1 = UP; else if (GetAsyncKeyState('S') & 0x8000) input1 = DOWN; this_thread::sleep_for(milliseconds(50)); } } void Run() { thread inputThread(&Game::InputThread, this); while (running && (snake1.alive || snake2.alive)) { auto start = high_resolution_clock::now(); if (input1 != STOP) { snake1.ChangeDir(input1.load()); input1 = STOP; } snake1.Move(); snake2.Move(); CheckCollisions(); if (!foodExists) GenerateFood(); UpdateMap(); Render(); auto end = high_resolution_clock::now(); auto duration = duration_cast<milliseconds>(end - start); if (duration.count() < 100) { this_thread::sleep_for(milliseconds(100 - duration.count())); } } if (!snake1.alive && !snake2.alive) cout << "\nDRAW! Both died.\n"; else if (!snake1.alive) cout << "\nPLAYER 2 WINS!\n"; else cout << "\nPLAYER 1 WINS!\n"; running = false; if (inputThread.joinable()) inputThread.join(); } string Serialize() { stringstream ss; ss << snake1.Head().x << "," << snake1.Head().y << ";" << snake2.Head().x << "," << snake2.Head().y << ";" << (int)input1.load() << ";" << food.x << "," << food.y << ";" << (foodExists ? "1" : "0"); return ss.str(); } void Deserialize(const string& data) { try { stringstream ss(data); string part; getline(ss, part, ';'); // snake1 getline(ss, part, ';'); // snake2 if (part.empty()) return; stringstream ss2(part); string px, py; getline(ss2, px, ','); getline(ss2, py, ','); Point p(stoi(px), stoi(py)); Point prev = snake2.Head(); Direction d = STOP; if (p.x == prev.x + 1) d = RIGHT; else if (p.x == prev.x - 1) d = LEFT; else if (p.y == prev.y + 1) d = DOWN; else if (p.y == prev.y - 1) d = UP; if (d != STOP) snake2.ChangeDir(d); snake2.Move(); getline(ss, part, ';'); // ignore remote input1 getline(ss, part, ';'); // food pos if (part.find(',') != string::npos) { stringstream fs(part); getline(fs, px, ','); getline(fs, py, ','); food = Point(stoi(px), stoi(py)); } getline(ss, part, ';'); foodExists = (part == "1"); } catch (...) { } } friend class NetworkManager; }; class NetworkManager { private: SOCKET sock; sockaddr_in addr; bool isServer; Game* game; public: NetworkManager(Game* g, bool server) : isServer(server), game(g), sock(INVALID_SOCKET) { } // 匹配声明顺序 bool Start() { WSADATA wsa; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { cerr << "WSA failed." << endl; return false; } sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { cerr << "Socket creation failed." << endl; return false; } addr.sin_family = AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = (isServer ? INADDR_ANY : inet_addr("127.0.0.1")); if (isServer) { if (::bind(sock, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) { cerr << "Bind failed." << endl; closesocket(sock); return false; } if (listen(sock, 1) == SOCKET_ERROR) { cerr << "Listen failed." << endl; closesocket(sock); return false; } cout << "Waiting for player 2 to connect..." << endl; SOCKET client = accept(sock, nullptr, nullptr); closesocket(sock); sock = client; cout << "Player 2 connected!" << endl; } else { while (::connect(sock, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) { cout << "Connecting to server... (make sure server starts first)" << endl; this_thread::sleep_for(seconds(2)); } cout << "Connected to server!" << endl; } thread(&NetworkManager::Communicate, this).detach(); return true; } void Communicate() { char buffer[512]; while (game->running) { string data = game->Serialize(); send(sock, data.c_str(), data.length(), 0); int n = recv(sock, buffer, sizeof(buffer) - 1, 0); if (n > 0) { buffer[n] = '\0'; game->Deserialize(string(buffer)); } this_thread::sleep_for(milliseconds(50)); } closesocket(sock); WSACleanup(); } }; int main() { cout << "Snake Battle - LAN Mode\n"; cout << "Choose mode:\n1. Server (Host)\n2. Client (Join)\nEnter 1 or 2: "; int choice; cin >> choice; string role = (choice == 1) ? "server" : "client"; Game game(role); NetworkManager net(&game, choice == 1); if (!net.Start()) { cerr << "Failed to start network." << endl; return 1; } this_thread::sleep_for(milliseconds(500)); game.Run(); cout << "Press Enter to exit..."; cin.ignore(); cin.get(); return 0; } ``` --- ## ✅ 编译命令(MinGW) ```bash g++ -std=c++11 snake_battle_fixed.cpp -lws2_32 -o snake.exe ``` > ⚠️ 注意:不要加 `-Wall` 如果你想忽略无关警告,否则仍会看到一些 `unused variable` 提示。 --- ## ✅ 修改总结 | 问题 | 原因 | 修复方式 | |------|------|---------| | `queue` 没有 `begin/end` | `queue` 不支持迭代器 | 改用 `deque<Point>` | | `switch` 未处理 `STOP` | 编译器警告 | 添加 `case STOP: break;` | | `#pragma comment` 警告 | MinGW 不支持 | 删除或忽略,在编译时手动加 `-lws2_32` | | 成员初始化顺序警告 | 声明顺序与初始化列表不一致 | 调整构造函数中初始化顺序 | --- ## ✅ 后续建议 - 若想完全跨平台(Linux/macOS),可用 `asio` 或 `SFML` 网络模块替代 Winsock - 控制台颜色可封装成跨平台函数 - 完整蛇身同步:序列化整个 `deque` 而非仅头部 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值