牛客学习知识点
-
c语言逗号运算符,这个经常会不注意,但平时经常写的int a,b=9;肯定是给b赋值,所以cout<<(a,b);肯定是输出b
-
vector迭代器erase掉一个元素会使后面的所有迭代器失效,所以要使用一个迭代器去接返回值
it = v_obj.erase(it++);
-
std::setw :需要填充多少个字符,默认填充的字符为' '空格
std::setfill:设置std::setw将填充什么样的字符,如:std::setfill('*')
std::setbase(n):将输出数据转换为n进制
std::setprecision():控制输出流显示浮点数的数字个数,C++默认的流输出数值有效位是6。
#include <iostream> #include <iomanip> #include <sstream> #include <shlobj.h> //AppData std::wstring GetUserAppDataDir() { std::wstring appdata; wchar_t buffer[MAX_PATH]; ::ZeroMemory(buffer, MAX_PATH*sizeof(wchar_t)); if (::SHGetSpecialFolderPath(NULL, buffer, CSIDL_APPDATA, NULL)) appdata = buffer; if (appdata.substr(appdata.length() - 1) != L"\") { appdata.append(L"\"); } return appdata; } //生成日志文件路径 std::wstring GetLogFileName() { SYSTEMTIME sysTime; ::GetLocalTime( &sysTime ); std::wstringstream logFileName; logFileName << GetUserAppDataDir().c_str() << L"_" << sysTime.wYear << L"_" << std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wMonth << L"_" << std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wDay << L"_" << std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wHour << L"_" << std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wMinute << L"_" << std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wSecond << L".log"; return logFileName.str(); } //字符串转数字 template <class T> T to_num( const char* s ) { T tmp(0); std::istringstream is(s); is >> std::setbase(10) >> tmp;//setbase(n):将输出数据转换为n进制 if(is.fail()) { return 0; } return tmp; }; //测试代码 int main() { int a = 1; int b = 2; char c = '$'; //输出: 1 std::cout << std::setw( 4 ) << a << std::endl; //输出:$$$1 std::cout << std::setw( 4 ) << std::setfill( c ) << a << std::endl; //输出:$$$12 std::cout << std::setw( 4 ) << std::setfill( c ) << a << b << std::endl; //输出日志文件路径 std::wcout << GetLogFileName().c_str() << std::endl; std::cout << " " << std::endl; //std::setbase()的使用 int num = to_num<int>("1234"); long ldata = to_num<long>("123456"); std::cout << num << std::endl; std::cout << ldata << std::endl; std::cout << " " << std::endl; std::cout << "255(2进制): " << std::setbase(2) << 255 << std::endl;//二进制输出 std::cout << "255(8进制): " << std::setbase(8) << 255 << std::endl;//八进制输出 std::cout << "255(16进制): " << std::setbase(16) << 255 << std::endl;//十六进制输出 //setprecision()的作用: 控制输出流显示浮点数的数字个数(C++默认的流输出数值有效位是6) //如果与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。 //setiosflags(ios::fixed)是用定点方式表示实数。 //setiosflags(ios::scientific)是用指数方式表示实数。 std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(8) << 12.123456 << std::endl; //如果与setiosflags(ios::scientific)合用,可以控制指数表示法的小数位数。 //在用浮点表示的输出中,setprecision(n)表示有效位数。 //在用定点表示的输出中,setprecision(n)表示小数位数。 system("pause"); return 0; }
-
派生类无论是public、protected、private继承,都能够访问和修改基类的public和protected成员,而派生类对象仅当public继承时才能够访问和修改基类成员,因此在基类中定义的protected成员在私有继承的派生类中可访问可修改的