在C++中实现Python的切片

2015-01-30 来源:未知作者:admin

 
\
 

本文描述了一个最近包含在我的Range-v3库中的巧妙方法:一个具有精炼语法的类似Python切片的工具。从功能的角度来看,这并没有什么惊天动地的,但在库设计中,却是一个有趣的小案例,同时,它也很好地说明了我的库设计理念。

Python切片

在Python中,切分容器,也即是创建一个连续子域的视图,它使用一个非常简洁的语法,比如:

>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # access a subrange with a slice operation
>>> letters[2:5]
['c', 'd', 'e']
>>> # replace some values
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']

第5行,我们使用语法letters[2,5)得到列表letters在半开区间[2,5)中的元素。简洁明了。第8行,我们使用切片赋值,最终改变了列表letters。如此证明Python切片具有引用的语义。

Python切片能做到的还不止这些。你可以省略偏移量,让Python使用智能缺省:

>>> # A missing first offset means "from the beginning"
>>> letters[:5]
['a','b','C', 'D', 'E']
>>> # A missing end offset means "to the end"
>>> letters[5:]
['f','g']

你甚至可以使用负的偏移量从末尾切片:

>>> # Take the last two elements:
>>> letters[-2:]

这都很酷很方便。