勇闯FreeBSD(四)

本文原来发表在CSDN博客上面,CSDN上内容现在已迁出至github page

人生在世,折腾二字


初入PC-BSD

下载PC-BSD时又范了一个错误,没有看清楚,先下了一个IA64的,结果不言而喻,没有法安装了,重新下。

PC-BSD(Mate Desktop,因为不喜欢KDE)安装没有什么新意,值得说的是PC-BSD前面分区的功能实在是弱爆了!但是安装很容易;网络配置也很顺利,没有出现问题,但是问题不是没有,输入法上面就出现问题了。


不能输入中文的iBus输入法

PC-BSD安装安装完成是默安装了iBus的,但是没有添加ibus-pinyin,需要自已添加,但是添加后,出现了下面的问题:

  1. ibus-pinyin的首选项打不开
  2. 用ctrl+space没有办法切换到汉语输入状态
  3. 用鼠标可以切换,但是输入任字,都是英文的,且输入法图标会变回去。 GOOGLE,而且检查过Python的Version,都是最新的,检查配置文件~/.cshrc有这些语句(csh,所以配置文件是~/.cshrc):

    1
    2
    3
    4
    5
    setenv XIM ibus
    setenv GTK_IM_MODULE xim
    setenv QT_IM_MODULE ibus
    setenv XMODIFIERS @im=ibus
    setenv XIM_ARGS "--daemonize --xim"

    网上各种方法试了一大堆,还是没有搞定,甚至都装了fcitx用了,准备将ibus完全册除掉,突然看到右上角有个软件升级的提示,就升级了,没有升级好了以后,ibus能用了,果然如FAQ上说的:“升级,升级能解决大部分问题”。后来在一个邮件中看到好像这个是ibus1.4.9的bug,和FreeBSD没有关系。目前iBus还有个问题,没有光标根随,还不知道怎么弄,另一个问题是没有找五笔输入法。

    心得:

  • 升级,升级能解决大部分问题

轻量级的Xfce

问题基本已经搞定了,但是总觉得Gnome(虽然目前装的是Mate)太占用资源,所以想换成Xfce试下,这还是第一次装Xfce,以前所用的都是Gnome家族的,PC-BSD下安装Xfce还是很简单的,在包管理器里面有,选上就OK了。

切换到Xfce上面后,惊喜啊,流畅,感觉确实比Mate省资源的多,速度不是一个级别的啊;界面也很漂亮,而且可以用Gnome的主题;以前在Gnome(ubuntu)上面不敢使用的界面也敢用了,赞啊!后悔以没有早试下这个。如果以后没有什么问题的话,就用这个了。

心得:

  • 还是要不断的尝新,可能就会有惊喜以上动作完成至2014-03-03,by Freedom Zhang

勇闯FreeBSD(六)

本文原来发表在CSDN博客上面,CSDN上内容现在已迁出至github page

人生在世,折腾二字


战胜困难

不出所料,又出错了,跟上次错误一样,静下心来看下什么错误:下载不到 pciids-20131130.tar.xz 这个软件包,再看详细信息:

1
2
3
4
===> Verifying install for /usr/local/share/pciids/pci.ids in /usr/ports/misc/pciids
===> pciids-20131130 depends on file: /usr/local/sbin/pkg - found
=> pciids-20131130.tar.xz doesn't seem to exist in /usr/ports/distifiles/.
=> Attempting to fetch http://ftp.FreeBSD.org/pub/FreeBSD/ports/local-distfiles/sunpoet/piids-20131130.tar.xz

OK,就是说这个包所依赖的东西都OK啦,然后后面也把下载地址告诉了,好,我们去这个ftp看看,能找到pciids这个包,但是版本不对,有其它3个版本的(如20140222),OK,这样就好办了,找下这个版本包的distinfo和Makefile,下载下来,替换原来的两个文件,freshport就有包的所有版本更新信息,也有diff文件。20140222对应的版本是可以在这里下,当然也可以用一个一个的diff文件打回20131130,只要不嫌麻烦,而且重新打包,SHA也可能变化,还是直接换包比较简单。

1
2
3
4
5
6
7
cd /usr/ports/misc/pciids
mv ./Makefile ./Makefile.bk
mv ./distinfo ./distinfo.bk
mount -t msdosfs /dev/da0s1 /media
cp /media/pciids/* ./
cd /usr/ports/x11-wm/xfce4
make install clean

以上动作完于2014-03-06, by Freedom Zhang


待续……

勇闯FreeBSD(五)

本文原来发表在CSDN博客上面,CSDN上内容现在已迁出至github page

人生在世,折腾二字


哑巴

系统总算弄的差不多了,突然想到好像还没有到一次开关机声音,不会还是个哑巴吧,试下,找了一个mp3文件播下听下,试了下,坏了,真的是个哑巴啊。算了,等后面再解吧!


从PC-BSD重回FreeBSD

话说,我好像还是比较爱折腾的,死了全当没有活过吗!心里想着为什么上次直接FreeBSD装图形界面不成,冲动下换成了PC-BSD,冲动是魔鬼啊,应该多试下,也许就成功了。自从有了这个念头,这个想法就在心里发酵了,越来越不可控制,决定今天晚上重装。

重装FreeBSD的过程没有任何波折,必竟这个本身不难,而且有经验了,装好了,网络也配置好了,下来就是装图形界面了,还是选Xfce4. cd /usr/ports/x11-wm/xfce4make install clean ,开始安装。

过程中出现了两次tag文件下载不下来(libxslt-1.1.28.tar.gz和libxml2-2.8.0.tar.gz),速度一直是0,在mac上面试着连了下这两个地址(xmlsoft),只能打开根目录,没有办法,应该是网络问题,只能在网上找这两个文件,哈哈,在fedoraproject上面找到了,下载下来后,将正在安装的过程ctrl+c了,然后

1
2
3
mount -t msdosfs /dev/da0s1 /media
cp /media/*.tar,gz /usr/ports/distfiles/gnome2/
make install clean

重新启动安装,欣慰的是安装过程在作完文件校验后,会接着上次的进度。太晚了,返正可以接着上次的进度,中断安装,睡觉,明天晚上再继续。

以上动作完成至2014-03-05,by Freedom Zhang


勇闯FreeBSD(三)

本文原来发表在CSDN博客上面,CSDN上内容现在已迁出至github page

人生在世,折腾二字


令人绝望的Gnome安装

昨天写完了配置好了ports了,可以开始安装其它需要的软件了,第一个需要安装的就是sudo命令,这个很间单,命令:

1
2
cd /usr/prots/security/sudo
make install clean

然后是安装Gnome(对Gnome3没有太大好感):

1
2
cd /usr/ports/x11/gnome2
sudo make install clean

然而,编译失败,有一个依赖的文件找不到,包过期了!这种在ports系统中比较少见的问题,毕竟ports系统是以将依赖关系处理的很好而著明的,我刚始就遇到了,不知道算不算幸运!或者算倒霉。由于安装Gnome2在FreeBSD的handbook中没有找到,于是GOOGLE,最后都没有找到soluction,安装Mate同样的错误,一气之下,决定下个PC-BSD弄弄。从此进入PC-BSD的旅程

以上动作完成至2014-02-28,by Freedom Zhang

勇闯FreeBSD(二)

本文原来发表在CSDN博客上面,CSDN上内容现在已迁出至github page

人生在世,折腾二字


莫名的网络配置

FreeBSD刚安装好后是没有图形界面的,所有的配置都在CLI下完成,对我这样的不熟CLI的人员来说,如果出现问题,就是噩梦。

FreeBSD安装好后,有一个无线网络配置的简短的过程,在家里将网络配好了(WPA的),但是到了公司出现悲剧了。公司有两个无线网络,一个是给访客用的Guest,是WPA的,另一个给员工用的Corp,WPA企业(EAP-PEAP),自已当然要配置成Corp的了,再说,我也不知Guest的密码啊。

好,先扫描网络,follow handbook,命令 sudo ifconfig wlan0 up scan ,因为“Only the superuser can initiate a scan:”,所以要加上sudo,但是,但是,但是问题是FreeBSD默认是没有安装sudo的,没有法,只能切换到root用下面弄,就我这外行的样子,进了root,总是担心权利太大,把系统搞坏了(果然是不适合当贪官的人啊)。

修改 /etc/rc.conf ,添加下面两句:

1
2
wlans_ath0="wlan0"
ifconfig_wlan0="WPA ssid Corp DHCP"

修改 /etc/wpa_supplicant.conf 文件,添加下面几行:

1
2
3
4
5
6
7
8
9
10
network={
ssid="Corp"
proto=RSN
key_gmht=WPA-EAP
eap=PEAP
identity="zzzz"
password="xxxxxxxxxx"
phase1="peaplabel=0"
phase2="auth=MSCHAPV2"
}

OK,按照handbook说的走下来,然而,但是,然而无论是重启服务,重启机器,网络总是自动连Guest,这还是在我指定了连“ssid Corp”的状况下出现的,在wpa_supplicant.conf中将有Guest的那个段册除,重启,就连不上任何网络了,手机可以正常连上Corp,所以Corp应没有问题,实在不明白问题,GOOGLE上的各种方法都试了,还是找不到解决方法。没有办法,关机,不管了,明天再说。然而更让我无语的是第二天开机后,就连上了Corp,而且再没有连过Guest,正常了!神,我又不是没重启过机器,这是怎么了?到现在都还不明白怎么回事。

心得:

  • FreeBSD的handbook真的很好,根着handbook走,基本上什么问题都能解决,虽然我的这个问题都不知道是怎么事。

ports系统

好了,网络搞好了,就快点更新ports系统,试了好多源,也不知道怎么回事,台弯的源居然比大陆的还要快,或许是我没有找到大陆的更快的源吧

1
sudo vi /etc/portsnap.conf

修改下面这行

1
2
#SERVERNAME=portsnap.FreeBSD.org
SERVERNAME=portsnap.tw.FreeBSD.org

然后命令

1
portsnap fetch extract

大功能告成

以上动作完成至2014-02-27, by Freedom Zhang

勇闯FreeBSD(一)

本文原来发表在CSDN博客上面,CSDN上内容现在已迁出至github page

人生在世,折腾二字

这是一个FreeBSD新人初用FreeBSD时所遇到的困难和解决方法的记录。开始时间是2014-02-25,但是文章是从2014-03-04开始写的,第一至第五都在2014-03-06重新编辑。


缘由

原来的老笔记本电脑是以前买的一个上上网本,新蓝NB-X20A,买回来后是没有装操作系统的,好像也不能说没有操作系统,因为装了DOS,你懂的!当时自已也没有想装盗版Win,那就装一个Linux玩玩,后来选的是Ubuntu(Gnome),用了几年,主要上上网,看看小说,流览下网页,也没有其它用处。其实我很喜欢Unix类操作系统的结构的,感觉结构比起Win来说好很多的,也清晰很多;最喜欢的是 /home 可以单独挂载一个分区,实现数和系统分开,因为我经常会把系统搞坏,重装之类是家常便饭。(题外话,装Gnome的Ubuntu要比WinXP占资源的多,老婆的同款装XP比我的Ubuntu流畅的不是一点半点)。后来买了iPad,电脑换了Mac,这个旧的也就没有用了,吃灰吃了很长时间,最近有点时间,又对FreeBSD感兴趄(刚开始是因为知道Mac是基于FreeBSD上面改来的,后来上论坛、看FreeBSD的handbook、看FreeBSD的价绍等文章,越来越对这个小恶魔有好感了),所以决定装个玩玩,然后就开始了一个艰难的旅程。

为什么用勇闯呢?因为从一开始就遇到困难,但我相信无论有多么的艰难,我一定闯得进去。

可能犯的错很多,也很低级,但还请SA的同学们和各路大神们鄙视的时候留点余地吧,不剩感激~


系统安装

话说,要安装,就要下一个安装件,FreeBSD官网上很容易找到,且提供了很多不同的安装方式;话说我们都知道本地安装要比网络快很多,尤其是在天朝这样的水管网络下,所以就下了个DVD的安装。在这里出现了第一个错误:FreeBSD官网提供的DVD的ISO文件是没有办法作成启动U盘的,在官网的价绍上是有说明的,要作U盘安装的,要下的是FreeBSD-10.0-RELEASE-amd64-memstick.img这个文件,这个才是U盘安装的境像,但悲剧的是我下的是DVD的,下载完成,查看U盘挂哪了 ll /dev/ ,然后就开始dd:

1
dd if=./FreeBSD-10.0-RELEASE-amd64-DVD.iso of=/dev/disk1s1 bs=20480M conv=sync

在这里出现了问题了,以前在dd时,bs的单位用都是小写,但是到了Mac下,小写不行了 Invalid number2m’` ,查资料才知道这个GNU dd的原因

1
If you see the error dd: Invalid number `1m’, you are using GNU dd. Use the same command but replace bs=1m with bs=1M

OK,等一段时间完成,插到新蓝上面,重启,准备装系,悲剧出现了,不能引导,刚开始以为是dd用的有问题,GOOGLE,找到了这样一句话

1
Remember, don't include an integer for the USB drive, e.g. '/dev/sdx1', as it would refer to the existing partition on that drive and not the drive itself.

OK,修改了重来

1
dd if=./FreeBSD-10.0-RELEASE-amd64-DVD.iso of=/dev/disk1 bs=20480M conv=sync

,等待完,再试,结果还是不能引导,然后上官网再看,才知道要用U盘,需(须)要下memstick.img的,而更加悲剧的是新蓝是没有光驱的,只能用U盘,所以重下。

总结教训:

  • FreeBSD的官网上资料很多,也很全,安装前要仔细看。
  • 经验主义害死人,因为以前下Linux的DVD ISO都可以作U盘引导的以上动作完至2014-02-25, by Freedom Zhang

32位XP下硬盘安装64位Win7 RTM

本来一直用32位XP的,但是因为自己的电脑的内存是4G的,32位系统没有办法全部识别,而最近又因为装驱动的时候把声卡驱动装坏了,没有了声音,于是决定重新安装一个64位的Win7玩一下。

首先说一下自己电脑的配置:
CPU: AMD PhenomXII 545. (本来想开四核的,结果开核失败,只能两核)
主板:捷波悍马HA07-Ultra.
硬盘:西数单碟500G.
内存:金士顿DDR2 800 2G*2.(以后打死也不买金士顿内存)
显卡:双敏HD4830小牛版.(800SP,但是没有交火的金手指,后悔啊)
风扇:超频三红海至尊.(不得不说AMD原装风扇实在太垃圾)

PS:之所以说以后打死也不买金士顿内存,买电脑后没有烤机,平常应用时电脑经常莫名其妙的死机,一直以为是软件问题,重装系统n次,没有解决。后来用主板BIOS自带的内存检测工具检测内存,发现有一条有问题。拔下该条内存以后重新检测,就没有问题了,开机,烤机4小时,无故障。以后一直到现在也没有死机过。把内存条拿到上海盈通售后服务点去,他们给我开了一张条子,然后然我将内存留下,说是最少一个半月跳回有消息,而且服务态度极差,对我爱理不理的。都快一个月了,到现在还没有消息,看来还真得一个半月啊。我就不明白怎么会用这么长时间,测试一下有问题,重新给我一个不久完了吗,所以以后打死也不买金士顿内存了。

  1. 首先先下载64位Win7.我的下载地址是:

    http://bbs.windows7en.com/thread-31026-1-1.html

  1. 下载完成后,本来准备刻盘的,后来想想,算了,直接用硬盘安装算了,然后在网上查了一下,在这个网址上面有几种方法介绍:

    http://www.itwin7.cn/html/win7-skill/2009/0320/557.html
    一看前面两种正常方法耗时都比较长,想想,算了,还是换一个吧,几个方法都浏览了一下,感觉第三个比较简单,OK,就他了。
    重启->F8->修复系统,不对,怎么没有修复系统这个选项?是不是跟别人的名字不一样,算了,挨个选项试,都不行。
    上面写的又不是很详细,看来此路不通,换一个。
    采用第五条路吧。
    解压整个光盘到F盘->复制文件->名两行下输入“c:/boot/bootsect.exe/nt60 c:”
    等待提示成功,嗯……好像有点问题,提示不是成功,而是“bootsect.exe不是有效的win32程序”。想想,嗯光盘里面自带的bootsect.exe应该是64位的,而系统是32位的,不出错才怪了。
    下载一个32位的bootsect.exe程序试试。地址:http://www.xdowns.com/soft/softdown.asp?softid=40504
    用这个替换c:/boot/bootsect.exe,然后重新输入“c:/boot/bootsect.exe/nt60 c:”,等候……嗯,成功了。
    重启。
    出现win7安装的进度条了,好了,按照第五条的方法,不过,在“修复计算机”和“命令提示符”这两个界面之间出现了不少的提示框,不管了,全部选择不安装之类,总能见到让你选择“命令提示符”的界面的。
    后面的就简单了,等着就行了。

    一段时间以后,进入系统了,安装了一下主板驱动,就全部搞定了。
    嗯!好像从解压缩Win7安装光盘一直系统安装完成(不包括解压缩和安装主板驱动),一共花了30分钟左右的时间,感觉还是很快的,因为中间还包括在网上找32为bootsect.exe文件等等时间的。

使用fgets函数返回值而不是feof

本文原来发表在CSDN博客上面,CSDN上内容现在已迁出至github page

今天在调试程序的时候,发现vector中多了一个数据。函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void create_testcase::read_districtfiles()
{
tstring::size_type pos=m_str_logpath.rfind(_T('//'));
if (tstring::npos==pos) return;
tstring str_name = m_str_logpath+m_str_logpath.substr(pos);
FILE *pinfile = _tfopen(str_name.c_str(), _T("rt+, ccs=UTF-8"));
if (NULL==pinfile) return;
TCHAR linex[MAX_PATH]=_T("");
tstring str_line, str_district, str_count;
while (!feof(pinfile))
{
_fgetts(linex, MAX_PATH, pinfile);
str_line = tstring(linex);
...;
m_name_vector.push_back(tspair(_ttoi(str_count.c_str()), str_district));
}
fclose(pinfile);
}

加断点看看,最后一个元素重复了,再追,发现原来是文件最后一行被fgets()函数读了两遍。

查MSDN,feof,有这么一段话:
“The feof routine (implemented both as a function and as a macro) determines whether the end of stream has been passed. When the end of file is passed, read operations return an end-of-file indicator until the stream is closed or until rewind, fsetpos, fseek, or clearerr is called against it.

For example, if a file contains 10 bytes and you read 10 bytes from the file, feof will return 0 because, even though the file pointer is at the end of the file, you have not attempted to read beyond the end. Only after you try to read an 11th byte will feof return a nonzero value.”

注意,上面说的是“the end of stream has been passed, read operations return an end-of-file indicator”,也就是说,只有文件位置指针越过文件结尾以后,read操作才会返回e-o-f的指示符。

测试1. 创建一个空的txt文件,并使用下面程序测试:

1
2
3
4
5
6
7
8
9
10
void TestFun1()
{
FILE *pinfile = _tfopen(_T("f://12.txt"), _T("rt+"));
if (NULL==pinfile) return;
while (!feof(pinfile))
{
MessageBox(NULL, _T("test"), _T("debug"), 0);
}
fclose(pinfile);
}

结果:啊哦,进入死循环了。
分析:文件位置指针一直没有越过文件结尾,feof一直返回为0,所以进入死循环。

测试2. 程序更改为:

1
2
3
4
5
6
7
8
9
10
11
12
void TestFun2()
{
FILE *pinfile = _tfopen(_T("f://12.txt"), _T("rt+"));
if (NULL==pinfile) return;
TCHAR szTest[MAX_PATH]=_T("");
while (!feof(pinfile))
{
_fgetts(szTest, MAX_PATH, pinfile);
MessageBox(NULL, szTest, _T("debug"), 0);
}
fclose(pinfile);
}

结果:弹出一个对话框,内容为空。
分析:fgets函数读MAX_PATH-1个字符以后,文件位置指针已经后移,并且越过了文件结尾,所以下一次调用feof时,返回非0值。

测试3. 在txt文件中添加数字“1”,TestFun2()函数测试。
结果:只弹出一个对话框,内容为1。
分析:fgets函数读MAX_PATH-1个字符以后,文件位置指针已经后移,并且越过了文件结尾,所以下一次调用feof时,返回非0值。

测试4. 在txt文件中1后面加上回车符,TestFun2()函数测试。
结果:弹出两个对话框,内容都为1。
分析:fgets第一次,遇到换行符,停止,此时文件位置指针已经到达文件尾部,但是还没有越过,所以,while没有退出, 因为文件位置指针已经到文件尾部,所以第二次fgets没有读到任何数据。

测试5. 文件内容不变,使用下面程序测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void TestFun3()
{
FILE *pinfile = _tfopen(_T("f://12.txt"), _T("rt+"));
if (NULL==pinfile) return;
TCHAR szTest[MAX_PATH]=_T("");
while (!feof(pinfile))
{
if (NULL!=_fgetts(szTest, MAX_PATH, pinfile))
MessageBox(NULL, szTest, _T("debug"), 0);
else
MessageBox(NULL, _T("NULL"), _T("debug"), 0);
}

fclose(pinfile);
}

结果:弹出两个对话框,内容分别为“1”和“NULL”。
分析:以上结果与测试4的分析是一致的。

测试6. 文件内容不变,使用下面程序测试

1
2
3
4
5
6
7
8
9
10
11
12
void TestFun4()
{
FILE *pinfile = _tfopen(_T("f://12.txt"), _T("rt+"));
if (NULL==pinfile) return;
TCHAR szTest[MAX_PATH]=_T("");
while (NULL!=_fgetts(szTest, MAX_PATH, pinfile))
{
MessageBox(NULL, szTest, _T("debug"), 0);
}
fclose(pinfile);

}

结果:只弹出一个对话框,内容为“1”。

总结:所以,我们在整行得去文件的时候,最好采用fgets函数的返回值来控制while循环而不是采用fefo函数。

STL中vector/list的几种赋值方法的速度比较

因为工作中遇到要对比较大的vector以及list进行比较频繁的互相复制的动作,为了提高赋值速度,所以对几种赋值方式的耗时进行了一下对比。

本文原来发表在CSDN博客上面,CSDN上内容现在已迁出至github page

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include"stdafx.h"
#include<iostream>
#include<vector>
#include<list>
#include<algorithm>
#include<Windows.h>
usingnamespacestd;

typedefvector<int>vType;
typedeflist<int>lType;

constintTEST_MAX_LEN=100000;

int_tmain(intargc,_TCHAR*argv[])
{
vTypev1,v2;
lTypel1,l2;

//初始化v1和l1
for(inti=0;i<TEST_MAX_LEN;i++)
{
v1.push_back(i);
l1.push_back(i);
}

//初始化计时器
LARGE_INTEGERtmp;
LARGE_INTEGERnSart;
LARGE_INTEGERnEnd;

QueryPerformanceFrequency(&tmp);

intfreq=tmp.QuadPart;
if(0==freq)return-1;
//用赋值操作符赋值vector
{
v2.clear();
QueryPerformanceCounter(&nSart);
v2=v1;
QueryPerformanceCounter(&nEnd);

cout<<"用赋值操作符赋值vector:/t"
<<(nEnd.QuadPart-nSart.QuadPart)*1000000/freq
<<endl;
}

//用赋值操作符赋值list
{
l2.clear();
QueryPerformanceCounter(&nSart);
l2=l1;
QueryPerformanceCounter(&nEnd);

cout<<"用赋值操作符赋值list:/t"
<<(nEnd.QuadPart-nSart.QuadPart)*1000000/freq
<<endl;
}

//用assign给vector赋值
{
v2.clear();
QueryPerformanceCounter(&nSart);
v2.assign(v1.begin(),v1.end());
QueryPerformanceCounter(&nEnd);

cout<<"用assign给vector赋值:/t"
<<(nEnd.QuadPart-nSart.QuadPart)*1000000/freq
<<endl;
}

//用assign给list赋值
{
l2.clear();
QueryPerformanceCounter(&nSart);
l2.assign(l1.begin(),l1.end());
QueryPerformanceCounter(&nEnd);

cout<<"用assign给list赋值:/t"
<<(nEnd.QuadPart-nSart.QuadPart)*1000000/freq
<<endl;
}

//用copy算法给vector赋值(插入迭代器方式)
{
v2.clear();
QueryPerformanceCounter(&nSart);
copy(v1.begin(),v1.end(),inserter(v2,v2.begin()));
QueryPerformanceCounter(&nEnd);

cout<<"用copy算法给vector赋值(插入迭代器方式)"
<<(nEnd.QuadPart-nSart.QuadPart)*1000000/freq
<<endl;
}

//用copy算法给list赋值(插入迭代器方式)
{
l2.clear();
QueryPerformanceCounter(&nSart);
copy(l1.begin(),l1.end(),inserter(l2,l2.begin()));
QueryPerformanceCounter(&nEnd);

cout<<"用copy算法给list赋值(插入迭代器方式)"
<<(nEnd.QuadPart-nSart.QuadPart)*1000000/freq
<<endl;

}

//用copy算法给vector赋值(resize)
{
v2.clear();
QueryPerformanceCounter(&nSart);
v2.resize(v1.size());
copy(v1.begin(),v1.end(),v2.begin());
QueryPerformanceCounter(&nEnd);

cout<<"用copy算法给vector赋值(resize)"
<<(nEnd.QuadPart-nSart.QuadPart)*1000000/freq
<<endl;

}

//用copy算法给list赋值(resize)
{
l2.clear();
QueryPerformanceCounter(&nSart);
l2.resize(l1.size());
copy(l1.begin(),l1.end(),l2.begin());
QueryPerformanceCounter(&nEnd);

cout<<"用copy算法给list赋值(resize)"
<<(nEnd.QuadPart-nSart.QuadPart)*1000000/freq
<<endl;

}

//用assign给vector赋值(从list)
{
v2.clear();
QueryPerformanceCounter(&nSart);
v2.assign(l1.begin(),l1.end());
QueryPerformanceCounter(&nEnd);

cout<<"用assign给vector赋值(从list):/t"
<<(nEnd.QuadPart-nSart.QuadPart)*1000000/freq
<<endl;

}

//用assign给list赋值(从vector)
{
l2.clear();
QueryPerformanceCounter(&nSart);
l2.assign(v1.begin(),v1.end());
QueryPerformanceCounter(&nEnd);

cout<<"用assign给list赋值(从vector):/t"
<<(nEnd.QuadPart-nSart.QuadPart)*1000000/freq
<<endl;

}

getchar();
return0;

}

结果

测试结果

总结:

  1. vector对于vector赋值方式中
    • assign的速度是最快的
    • 其次是resize以后用copy算法赋值
    • 而最先能够想到的赋值操作符,速度却并不快,只能够排名第三,目前还不知道这是为什么
    • 采用插入迭代器再用copy的方式是速度最慢的一种。
  2. list对于list赋值
    • 赋值操作符的速度是最快的
    • 其次是assign
    • 然后是采用resize的copy
    • 最后一位同样是采用插入迭代子方式的copy。

在VS2005中设置Build Events

本文地址: http://blog.csdn.net/autophyte/archive/2008/11/07/3245372.aspx

本文原来发表在CSDN博客上面,CSDN上内容现在已迁出至github page

Build Event下有3项,所代表的意思分别是:

  1. 在编译前执行以下事件;
  2. 在连接前执行以下事件;
  3. 在编译后执行一下事件;

step0

选中Pre-Build Event,然后在右边窗口中选择Command Line,在这里我们可以输入DOS命令来完成我们需要完成的工作,比如拷贝需要用到的库文件到指定的目录下。

step1

点击Macros按钮,打开下面的宏菜单,这里有关于VS2005的一些目录和工程目录的宏,用宏选取目录的好处就是选取的路径都是相对路径。

step4