Dependent Origination

怎样用stl的copy算法

Posted on: September 26, 2008

10/20/2006

今天一天班上得非常有收获哈. 先是学到了数据结构的奇巧, 后是解决了一个我困惑已久的问题 同事里面牛人多哈

话说问题是这个样子的. 我吃饱了撑的, 打算学习一下stl. 当年一个很想去的market maker公司就是因为我不懂stl结果没去成. 当年我做他们的entrance test的时候特别impressive, 那个老板左想一个折右想一个折想给我一个position, 可惜, 当时我连map就是一个red black tree都不知道, 浪费了自己的机会. 绕回今天要说的先 所 以我痛定思痛, 觉得要懂一点儿这个, 艺不压身的吗. 所以时不时的不惜走上十几道弯路, 也要在自己的code里面用上stl. 比方说一次我要一个十个元素的整数数组, 填上一到十这些个数字. 我居然变态的用了iota这个算法. 结果这个算法只有在algorithm.h里面才有原型, <algorithm>里面没有. 到production server上面编译都没过. 我老板给我发了一个email说同学你能不能换个用法. 我只好老老实实得改用了for loop. 属于比较搞笑性质的插曲

话说有一次我看到了copy这个算法的使用例子. 一行code, 就可以把一个vecotr<string>打印到一个文件里面去. 这个简直太有productivity了. 我用了好几次之后, 开始想打印更加复杂的data structures. 本来的样子是这样子的.

copy(vector.begin(), vector.end(), ostream_iterator<string>(file, “\n”));

比方说现在我想把vector<pair<string, string> >的内容打印到文件里面去. 该怎么办呢? naturally, 要给pair<string, string>提供一个operator<<. 但是我写了这个函数ostream& operator<<(ostream&, const pair<string, string>&)之后, 还是编译不了. 上一次试了好半天, 结果就是不行. google好半天, 都是simple class的例子, 没什么用.

今天又写到一个可以这么用的地方, 想到上午两个同事看起来都知道点儿stl的东东, 就去问他们. 结果他们跟我说的和我想的是一样的. 没什么帮助. 我又开始沮丧了. 想算了这次好好读一下那些stl的error message吧. (那个真不是人读的东西) 视力下降了一个数量级之后, 好像看明白了, 确实就是少一个operator<<, 而且好像需要的类型是basic_ostream<char, char_traits<char> >, 所以把ostream改成这个. 靠. 仍然编译不了. 把其中一个家伙叫过来. 不知道是怎么回事儿. 两个人唉声叹气了一阵子, 说算了, 这stl fancy是好fancy, 但是这么奇怪, 怪不得大家都不用呢. 算了, 我还是写for loop, 自己printf吧.

我已经开始写for loop了, 这个家伙突然来找我, 原来他google比较厉害, 发现了solution! (我google的时候没有用pair这个关键词, 老想着找generic solutions了, 教训教训!) 其实只要把那个operator<<的函数弄进std namespace就可以啦. 据说这个是namespace lookup的时候的bug, 大概就是那个Koenig lookup的算法实现的时候, 最后没有search global namespace, 所以compiler总是在complain找不到这个operator函数. 但是要注意的是, 这个fix是illegal的, 因为you are not supposed to put anything into the namespace std. that is reserved for the language implementation only! Anyway, 我只是想要productivity而已. illegal就illegal吧.

Moral of this story: 鼻子下面是嘴, 要多问!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

September 2008
M T W T F S S
« Dec   Oct »
1234567
891011121314
15161718192021
22232425262728
2930  

Twitter

  • is reflecting on the past three years and reading the article on divided self aptly showing up at the top of my tweeter feed. 1 month ago
  • is having a nice feeling of connecting dots all over the place. they are now illuminating the same point. 2 months ago
  • Style Transfer is fun! TensorFlow rocks! #WTM17 https://t.co/zYP0IFIDfp 4 months ago
  • couldn't get over the jetlag, sleeping during the day from seven to four, for days. 6 months ago
  • is emptying trash and happily discovering the available disk space now ranks at 100G+. 7 months ago

Flickr Photos

%d bloggers like this: