C++初始化列表与类内初始化

类内初始化可使用{},=,不可使用(),如

class test2
{
public:
    int c=6;//正确
    int d{7};//正确
    int e(8);//错误
};

初始化列表可使用{},(),不可使用=,如

class test2
{
public:
    test2(int h, int z) : c(h), d{z}
          //不可使用 c=h
    {
        cout << h << endl;
        cout << z << endl;
    };
};

一个成员同时在类内初始化与初始化列表时,实际结果表明初始化列表生效

#include <iostream>
using namespace std;
class test2
{
public:
    int c = 6;
    int d = 7;
    test2(int h, int z) : c(h), d{z}
    {
        cout << h << endl;
        cout << z << endl;
    };
};
int main()
{
    test2 a{10, 19};
    return 0;
}

以上代码输出10 19。

发布日期:
分类:C++

B:魔兽世界之一:备战

http://cxsjsxmooc.openjudge.cn/test/B/

系统关闭,未测试

#include <iostream>
#include <iomanip>
using namespace std;
class headquarters;
extern int Time;
class warrior
{
private:
    int num;
    const int life;

public:
    friend class headquarters;
    const int id;
    const static char name[][10];
    static int lifes[];
    warrior *next;
    warrior(int _id, int _life, int _num = 0) : id(_id), num(_num), life(_life), next(NULL){};
    bool create(int &w)
    {
        if (w >= life)
        {
            w -= life;
            num++;
            return true;
        }
        else
            return false;
    }
};
class headquarters
{
private:
    int life;
    warrior *pp;
    const int *order;
    const char *color;
    bool stop;
    int num;

public:
    headquarters(int _life, const int _order[], const char *_color) : pp(NULL), life(_life), order(_order), color(_color), stop(false), num(0)
    {
    }
    ~headquarters()
    {
        while (pp != NULL && pp->next != pp)
        {
            warrior *temp;
            temp = pp->next->next;
            delete pp->next;
            pp->next = temp;
        }
        delete pp;
    }
    void add_node(int _id)
    {
        warrior *temp = new warrior(_id, warrior::lifes[_id]);
        if (pp == NULL)
        {
            pp = temp;
            pp->next = pp;
        }
        else
        {
            temp->next = pp->next;
            pp->next = temp;
            pp = temp;
        }
    }
    bool making()
    {
        if (stop)
            return false;
        pp = pp->next;
        if (pp->create(life))
        {
            num++;
            cout << setw(3) << setfill('0') << Time << ' ';
            cout << color << ' ' << warrior::name[pp->id] << ' ' <<num <<' '<<"born with strength "<<pp->life<<","<< pp->num <<" "<<warrior::name[pp->id]<<" in "<<color<<" headquarter"<< endl;
            return true;
        }
        else
        {
            warrior *temp = pp->next;
            while (temp != pp)
            {

                if (temp->create(life))
                {
                    num++;
                    cout << setw(3) << setfill('0') << Time << ' ';
                    pp = temp;
                    cout << color << ' ' << warrior::name[temp->id] << ' ' <<num<<' '<<"born with strength "<<temp->life<<"," << temp->num <<" "<<warrior::name[temp->id]<<" in "<<color<<" headquarter"<<endl;
                    return true;
                }
                temp = temp->next;
            }
            stop = true;
            cout << setw(3) << setfill('0') << Time << ' ';
            cout << color << " headquarter stops making warriors" << endl;
            return false;
        }
    }
};
const char warrior::name[][10]{"dragon", "ninja", "iceman", "lion", "wolf"};
int warrior::lifes[5]{0};
const int _order[2][5]{{2, 3, 4, 1, 0}, {3, 0, 1, 2, 4}};
const char color[][5] = {"red", "blue"};

int Time = 0;
int main()
{
    int n;
    cin >> n;
    for (int j = 1; j <= n; j++)
    {
        cout << "Case:" << j << endl;
        int h_life;
        cin >> h_life;
        for (int i = 0; i < 5; i++)
        {
            cin >> warrior::lifes[i];
        }
        headquarters red(h_life, _order[0], color[0]);
        headquarters blue(h_life, _order[1], color[1]);
        for (int k = 0; k < 5; k++)
        {
            red.add_node(_order[0][k]);
            blue.add_node(_order[1][k]);
        }
        for (Time = 0;; Time++)
        {

            bool a, b;

            a = red.making();

            b = blue.making();
            if (!(a || b))
                break;
        }
    }
    return 0;
}

发布日期:
分类:C++

校门外的树,允许较大l解法,C++版

http://pkuic.openjudge.cn/hw05/8/

#include <iostream>
using namespace std;
int main()
{
    int l, m;
    cin >> l >> m;
    int a[2][m] = {0};
    int k = 0;
    for (int i = 0; i < m; i++)
    {
        cin >> a[0][i] >> a[1][i];
        if (a[0][i] > a[1][i])
            swap(a[0][i], a[1][i]);//防止输入数据反向
        if (a[1][i] > l)
            a[1][i] = l;//忽略掉右侧超过l的部分
        if (a[0][i] > l)
        {
            i--;
            m--;
        }//忽略掉左侧超过l的输入
    }
    for (int i = 0; i < m; i++)
    {
        for (int j = i + 1; j < m; j++)
        {
            if (a[0][i] <= a[1][j] && a[0][j] <= a[1][i])
            {
                a[0][i] = min(a[0][i], a[0][j]);
                a[1][i] = max(a[1][i], a[1][j]);
                swap(a[0][j], a[0][m - 1]);
                swap(a[1][j], a[1][m - 1]);
                m--;
                j=i;
            }
        }
    }//合并重复砍掉的树
    for (int i = 0; i < m; i++)
    {
        k += (a[1][i] - a[0][i] + 1);
    }//计算砍掉的数
    l = l - k + 1;
    cout << l << endl;
    return 0;
}
发布日期:
分类:C++

C语言指针数组,数组指针小记

谈一些浅显的理解,如有错误欢迎指正

只有在强制转换类型时,才是变量类型结合后面的*,例如

a=(int*)malloc(5*sizeof(int));

在其他情况下都是后面变量结合前面的*,如声明指针变量时

int *p;
int (*p);//正确等价

(int*) p;//错误示范!!

在声明函数时可以不写形参,可以理解为隐藏了而并非没有,形参如果有指针理解为*与未写的参数结合

int test(int *);
int test(int *p);
int test(int (*));
int test(int (*p));//以上声明方式皆正确等价

int test((int*)p);
int test((int*));//错误示范!!

对于typedef定义指针类型时*同样要放到类型前面,如

typedef struct Lnode
{
data;
struct Lnode *next;
}*linklist;

当指针、数组、函数相结合时,先结合什么就是什么,如

int *p[4];
int *(p[4]);

以上由于[]优先级比*高,二者等价,因为先结合[]所以p是个数组!!!然后每个数组的元素时int型指针

int (*p)[4];

以上先结合*,所以p是个指针,指向4元素int类型数组

对于指针与函数,如

int *test(int);
int (*test(int)); //以上表示返回值是int型指针的函数

int (*test)(int); 
int ((*test)(int));//指向函数的指针

(int*) (test(int));//错误示范!!!

前两个当中test先和后面的(int)结合,所以test本身是函数,然后和前面结合,返回值为int型指针

第三、四个test先和*结合,所以test是指针,再和后面结合表示函数,返回值为int型

最后一个是错误示范

发布日期:
分类:C

关于某程序sniffing选项小计

当”sniffing”为true时,程序会分析收到的请求,并对某些协议如http,https重新变为对域名进行请求而非ip。

无论对于服务端或是本地端,开启都可以有效解决某些情况下dns污染的问题,以及让dns在服务端进行最终解析,获得更优ip。

在本地端如果仅使用socks5或http代理,由于这二者本身就可以传递对域名的请求给程序,似乎开启的意义并不大,当然也没有多大坏处。

发布日期:
分类:默认

某程序域名解析规则小计

“AsIs”只匹配域名

“IPIfNonMatch”优先匹配域名,未匹配到再匹配IP

“IPOnDemand”域名与IP匹配优先级相同

而程序似乎是按照”rules”中的顺序进行匹配的,即有冲突的时候”rules”中靠前的生效

发布日期:
分类:默认

。。

想的明明很清楚,可我为什么还是忍不住想她,忍不住打这个电话。。。哎

发布日期:
分类:dlx心情

心情依旧复杂,哎,总会过去的,好好看书吧。

发布日期:
分类:dlx心情

搭建北邮人pt反代

昨日,有大佬邀请我进入北邮人pt,然而北邮人需要使用ipv6访问,于是有了这篇记录
在刘威廉大佬的介绍下参考了R酱大佬的教程 https://blog.rhilip.info/archives/72/
然而这篇教程 subs_filter 这个第三方模块,而我这种懒人,实在懒得去编译nginx,都是直接使用Arch Linux官方库中的软件包,所以尝试使用sub_filter来实现

1.服务器得有ipv6(废话)
2.绑定域名,签发 Let’s Encrypt 证书。(可选,你大可以不使用https。)签发过程参考 https://certbot.eff.org/
3.设置反向代理,修改nginx配置文件对应的server中的location。如下
location / {
resolver 8.8.8.8 valid=300s;
proxy_pass https://bt.byr.cn;
sub_filter bt.byr.cn $host;
sub_filter_once off;
proxy_set_header Accept-Encoding "";
}

4.设置密码nginx密码。由于我是用来私人使用的,所以设置了密码。不需要的大可以跳过。我们需要htpasswd这个工具。由于我是Arch Linux,并且已经安装了yay,所以这里直接
yay -S apache-tools 
htpasswd -c /var/test test

并设置密码
修改nginx配置文件 ,在对应server中添加
auth_basic "test";
auth_basic_user_file /var/test;

最终server配置如下

server {
    listen 443 ssl http2;
    server_name mdzz.xm1s.com;
    ssl_certificate /etc/letsencrypt/live/mdzz.xm1s.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mdzz.xm1s.com/privkey.pem;
    ssl_protocols TLSv1.3;
    auth_basic "test";
    auth_basic_user_file /var/test;
    location / {
        resolver 8.8.8.8 valid=300s;
        proxy_pass https://bt.byr.cn;
        sub_filter bt.byr.cn $host;
        sub_filter_once off;
        proxy_set_header Accept-Encoding "";
    }
}

发布日期:
分类:默认