Skip to content

C++坑点记录- set删除

最近在写一道Facebook hacker cup的题时,需要使用平衡树维护操作。遂调用了C++标准库里的set,在确保解题思路没有出错的情况下,我发现自己始终有一组样例无法通过。在检查了很久的细节并找了标程对跑中间过程以后,我发现我在使用set做删除的时候,迭代器发生了和我预想不一样的变化。

我在一个函数中调用了set的erase操作来删除某个迭代器,函数的传入参数为要删除的迭代器,类似如下

set<int> aha;

void del(set<int>::iterator it)
{
    //一顿操作
    aha.erase(it);
}

然后我在main中想要删除一个迭代器,并左移一位或右移一位迭代器,类似如下

int main()
{
    set<int>::iterator now;
    //一顿操作

    //操作1
    now=aha.find(5);
    del(now);
    now--;

    //操作2
    now=aha.find(5);
    del(now);
    now++;
}

上面是我原来的写法,删除这个迭代器所在的位置,然后移位。
但理想很美好,现实有差距。在我用标程对拍以后,我发现上述操作存在很大问题。
使用erase操作删除一个迭代器以后,我访问该迭代器,他仍旧是原来的值。
但当我想要左右移位时,经测试发现不管你左移还是右移,他返回的都是删除的迭代器在原set中的前一个位置。
也即

    set<int>::iterator now=aha.find(8);
    del(now);
    /*
    现在--now和++now都是同一个位置
    为未删除now的set中,now的前一个位置
    */

了解这个就好办了,我预先存下我要删除的位置,然后迭代器先更新,再调用删除即可。
这个主要还是对STL不够熟悉造成的,为此,我后来还去翻阅了set中erase操作的函数原型及返回值

学习Machine Learning

machinelearning1719

最近在Coursera上了一门Machine Learning的MOOC课程。

该课程是由Stanford的Andrew教授授课,内容由浅入深,从基础的机器学习概念到中期的几个利用机器学习的例子再到后来比较复杂的运用,Andrew教授讲得很清晰,哪怕你没有接触过机器学习,也能很容易理解课程。而且大部分课后都会有一个编程的大作业,让你用这周学到的东西实现一个真实的Machine Learning结果。编程大作业里面的内容被分割成一个个的小部分,当你完成了里面的一部分时,可以使用submit进行在线评判该部分是否正确。这有点像我平时OnlineJudge上刷题然后返回结果。

而当完成一份编程大作业的时候,那种感觉真的是非常满足。

比如在学到中期时,我了解了神经网络的算法,并使用该算法成功做出了简单的图像识别(识别图片中的阿拉伯数字):预先将图像的像素点处理好,然后构建多层神经网络,机器一步步学习调节参数,直到最后可以用作预测。

当一张图片显示在屏幕上,并且你的程序给出了该图片中的数字时,我发现原来自己这一周学的东西并不是非常理论性的内容,它能确确实实做出点很COOL的东西。

课程使用的是Matlab/Octave 进行编程,如果你没接触过这两门语言并不要紧,Andrew教授在课程中有讲解该怎么使用。而且,课程也会提供给你一定时限的Matlab授权(课程时间左右),同时,你也可以使用免费的Octave(GNU项目,两者语法基本相同)编程。我自己在Ubuntu下就是使用Octave完成编程大作业。

在此,我强烈推荐对Machine Learning感兴趣的童鞋去听一下这课,由于他的MOOC形式,你可以在任何你有空的时间看,形式非常自由。

我自己把我每周完成的编程作业上传到了>>Github<<以供自己复习和大家参考。

Apache2支持.htaccess实现目录加密

最近在使用学校电脑时,经常遇到这么个场景:

想下载个CodeBlocks用于coding或想下个vpt来玩会万智,但通过机房网络访问一些国外网站的下载速度只有10+kB/s,不到100m的文件总能让人等很久。

以前通过百度云来解决了这个问题,现在百度云下载这些文件需要使用客户端(大文件?),所以寻思着有没有什么好的解决方案。

突然想起自己在阿里云有个小服务器,在上面挂了个OJ,大多数资源都是闲置的。所以很简单,我就在网站目录下面传了我需要的常用文件上去,走阿里云的带宽下载。但直接放上去的文件所有人都可以下载,那对我的流量压力会比较大,所以我使用了.htaccess进行单目录加密。

首先开启Apache对.htaccess的支持(默认是关闭的)。

启动apache的mod_rewrite 模组

sudo a2enmod rewrite

重启apach服务器

sudo service apache2 restart

修改目录权限:

打开apache2.conf

vim /etc/apache2/apache2.conf

添加下面字段

<Directory /var/www/你需要开启加密的目录>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

重启apache服务

sudo service apache2 restart

现在对.htaccess的支持已经打开,接下来编辑对应文件即可:
在你要加密的目录下,新建.htaccess文件,填入一下内容

AuthName "===LOGIN==="
AuthType Basic
AuthUserFile /var/www/你的加密目录
Require valid-user 你要的用户名

保存,然后生成口令:

htpasswd -c /var/www/你的加密目录 你的用户名

然后会被要求输入两遍密码,ok,现在就已经设置完加密目录了,快去试试吧。

pri_oj