数据结构与算法——Permutation a String

state space tree back tracking brute force recursion 算法一: #include <iostream>using namespace std; void permutation(char S[], int k){ static int A[10] = {0}; static char res[10] = {0}; if(S[k] == '\0'){ res[k] = '\0'; printf("%s\n", res); } else{ for(int i = 0; S[i] != '\0'; ++i){ if(A[i] == 0){ A[i] = 1; res[k] = S[i]; permutation(S, k+1); A[i] = 0; } } } } int main() { char S[] = "ABC"; permutation(S, 0); return 0; } output:...

September 27, 2024 · 1 min · Rick Cui

C++ 类的内存布局

测试代码: #include <iostream> using namespace std; struct A{ long long a = 10; virtual void fa(){ cout << "A::fa()\n"; } virtual void faa(){ cout << "A::faa()\n"; } }; // 如果是虚继承,虚基类被放在了派生类的后面,每个基类都有自己的虚函数表指针存储单元,如果虚基类没有虚函数,则虚基类的虚函数表指针为 0 // 如果是非虚继承,基类在派生类的前面,每个基类都有自己的虚函数表指针存储单元,除了第一个基类(派生类与第一个基类共用一个存储单元) struct E: virtual A{ long long e = 2; virtual void fa(){ cout << "E::fa()\n"; } virtual void fe(){ cout << "E::fe()\n"; } }; int main() { typedef void(*FUNC)(); E e; cout << sizeof(e) << endl; long long* addr = (long long*)&e; long long* vfptre = (long long*)*(addr + 0); int eval = (int)*(addr + 1); cout << eval << endl; long long* vfptra = (long long*)*(addr + 2); int aval = (int)*(addr + 3); cout << aval << endl; cout << "---------------\n"; long long* faptr = (long long*)*(vfptre + 0); (FUNC(faptr))(); long long* feptr = (long long*)*(vfptre + 1); (FUNC(feptr))(); cout << "---------------\n"; long long* faptra = (long long*)*(vfptra + 0); // (FUNC(faptra))(); // 如果虚基类的虚函数被重写,此处则无法再如此执行 long long* faaptra = (long long*)*(vfptra + 1); (FUNC(faaptra))(); return 0; } 输出:...

May 18, 2024 · 4 min · Rick Cui

C++——统计代码行数

cloc 下载地址 加入到环境变量 执行命令 参考: 好用的源码行数统计工具——cloc Win10 代码行数统计工具CLOC的安装和使用

April 2, 2024 · 1 min · Rick Cui

C++——Function Style Cast 有歧义

#include <iostream>#include <string>using namespace std; struct Print { template<typename T> Print(T t){ cout<<(t+=10); } }; struct S { S(int a){ cout << a << endl; }; }; void foo(double a) { S w(int(a)); // function declaration // S x(int()); // function declaration S y((int(a))); // object declaration S yy((int)a); // object declaration S z = int(a); // object declaration } template <class T> struct X {}; template <int N> struct Y {}; X<int()> a; // type-id X<int(1)> b; // expression (ill-formed) Y<int()> c; // type-id (ill-formed) Y<int(1)> d; // expression void foo(signed char a) { sizeof(int()); // type-id (ill-formed) sizeof(int(a)); // expression sizeof(int(unsigned(a))); // type-id (ill-formed) (int())+1; // type-id (ill-formed) (int(a))+1; // expression (int(unsigned(a)))+1; // type-id (ill-formed) } int main() { // 这句为什么是一句函数声明而不是变量创建? double a = 3....

February 21, 2024 · 1 min · Rick Cui

adb 与安卓使用

查看包名 adb shell pm list package adb shell pm list package | findstr xxx 查看包的信息 adb shell pm dump com.xxx.xxx.xxx | findstr version adb shell dumpsys package com.xxx.xxx.xxx | findstr version 查看包的路径 adb shell pm path com.xxx.xxx.xxx 获取系统应用 adb shell pm list packages -s 获取第三方应用 adb shell pm list packages -3 启动指定 activity adb shell am start -n com....

December 23, 2023 · 2 min · Rick Cui