怎样自一个连结串列/杂凑表等等里面,插入/存取/改变元素?
我将以最简单的「插入连结串列」为例。想把元素插入串列的头尾很容易,但只限
於这些功能的话,会使程式库过於低能(太低能的程式库比没有更糟)。
完整的解答会让 C++ 新手消化不良,所以我只提几个项目。第一个是最简单的,第
二和第三是比较好的。
[1] 替 "List" 加入一个「现在位置」的性质,加入像是 advance()、backup()、
atEnd()、atBegin()、getCurrElem()、setCurrElem(Elem)、insertElem(Elem)
、removeElem() 等等的运作行为。
即使在这个小例子里已经够用了,但「只有一个」现在位置的记号的话,想存取
串列中两个以上位置的元素就不太容易(譬如:「对所有 x,y 序对,做底下的
事情……」)。
[2] 把上述的 List 运作行为拿掉,移到独立的类别 "ListPosition" 中。
ListPosition 的作用是:代表 List 里「现在的位置」,这样就允许许多位置
并存於同一个串列中。ListPosition 是 List 的夥伴,所以 List 的内部可对
外界隐藏起来(否则 List 的内部就会被它的公共运作行为所公开)。注意:
ListPosition 可以把运算子多载起来,像是 advance()、backup(),因为运算
子多载只是正常运作行为的语法糖衣而已。
[3] 把整个位置处理(iteration)当成是一个基元事件(atomic event),建一个
class template 去涵盖该事件。
它不会在内部回圈中使用公共存取运作行为(它有可能是虚拟函数),所以效率
能增进。不幸的,你的应用软体会多出些额外的二元码,因为 template 是以空
间换取时间的。欲知详情,请见 [Koenig, "Templates as interfaces,"
JOOP, 4, 5 (Sept 91)], 以及 [Stroustrup, "The C++ Programming Language
Second Edition," under "Comparator"].
我将以最简单的「插入连结串列」为例。想把元素插入串列的头尾很容易,但只限
於这些功能的话,会使程式库过於低能(太低能的程式库比没有更糟)。
完整的解答会让 C++ 新手消化不良,所以我只提几个项目。第一个是最简单的,第
二和第三是比较好的。
[1] 替 "List" 加入一个「现在位置」的性质,加入像是 advance()、backup()、
atEnd()、atBegin()、getCurrElem()、setCurrElem(Elem)、insertElem(Elem)
、removeElem() 等等的运作行为。
即使在这个小例子里已经够用了,但「只有一个」现在位置的记号的话,想存取
串列中两个以上位置的元素就不太容易(譬如:「对所有 x,y 序对,做底下的
事情……」)。
[2] 把上述的 List 运作行为拿掉,移到独立的类别 "ListPosition" 中。
ListPosition 的作用是:代表 List 里「现在的位置」,这样就允许许多位置
并存於同一个串列中。ListPosition 是 List 的夥伴,所以 List 的内部可对
外界隐藏起来(否则 List 的内部就会被它的公共运作行为所公开)。注意:
ListPosition 可以把运算子多载起来,像是 advance()、backup(),因为运算
子多载只是正常运作行为的语法糖衣而已。
[3] 把整个位置处理(iteration)当成是一个基元事件(atomic event),建一个
class template 去涵盖该事件。
它不会在内部回圈中使用公共存取运作行为(它有可能是虚拟函数),所以效率
能增进。不幸的,你的应用软体会多出些额外的二元码,因为 template 是以空
间换取时间的。欲知详情,请见 [Koenig, "Templates as interfaces,"
JOOP, 4, 5 (Sept 91)], 以及 [Stroustrup, "The C++ Programming Language
Second Edition," under "Comparator"].
Go confidently in the directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!