Ⅰ 一個差客服毀掉半個運營:說說那些缺乏「人情味」的游戲客服
有求必應的「機器人」,並不惹人喜愛,有時,會遭人反感。
文/菲斯喵
「我們寧可多『肝』幾天代碼,也不想再做一分鍾的客服。」
某M曾與葡萄君訴過苦。那時,他主導的 游戲 剛剛上線Steam,遭遇了幾多差評。「我們總共也沒幾個人,只能把開發人員調去做客服。可那些天,玩家可能太激動了,我們兼職做客服的程序員都被『罵抑鬱』了。」
但對於長期處在客服崗位上的人來說,扛著負能量,沖到第一線,去解決玩家的問題,去挽救失陷的口碑,已經成為了工作日常。這么一幫對 游戲 發展、用戶留存起到重要作用的人,卻常常 被玩家當成了「機器人」 ——葡萄君還曾見過有玩家驚呼,「這個和我聊天的,居然是 真人 !」
一位客服從業者在知乎上分享的個人經歷
客服的這種固有印象,在哪一行當,都是存在的。究其原因:繞不開這項工作本身有機械辦事的特點;近幾年AI客服的盛行;以及客服在實際工作中,會用比較定式、套路的交流話術去回應海量用戶的問題。
沒有人情味 的客服,自然會被玩家視為機沖棗器人。盡管他們有求必應,卻 並不惹人喜愛 ; 有時,反而會遭人反感 ,無益於 游戲 的運營。葡萄君覺得,這或許是一個還未被多數廠商所重視的問題。因而在本文中,我們將會試著呈現那些讓玩家覺得 「你是機器人」 的幾種情況。
我們是如何判斷客服缺乏人情味?
這次的觀察對象,是TapTap社區中的評論區——我們主要想看看, 在不同 游戲 底下,客服們,是如何針對情況不同的負面評價,去和玩家做互動和交流 。根據回應方式和話術,我們會做出自己的判斷:這些 游戲 的客服是否有人格化的特徵,以及,他們是如何讓人體會不到人情味。
我們覺得,即使是在這種線上公共空間里,客服針對玩家負面評價的回應,也有必要讓對方享有愉悅的體驗。值得一提的散州拆是,文中討論的「客服」,並不是專門指處在這個崗位的工作人員,他們也許是運營,也許是開發人員,也許還會是公司的CEO,但 都深度參與到與玩家的溝通工作中 。
另外,葡萄君還想強調一點,我們沒有試圖去主張, 「有人味」就該是各家 游戲 公司在客服工作上,必須追求的方向。 我們也不保證,恪守「有人味」的客服工作標准,就能讓 游戲 公司獲得非常好的回報。畢竟,具體情況需要具體分析。
我們沒有針對誰,也沒想說在座的都是如何。只是在此想提醒各家 游戲 廠商, 客服在言行上的無個性、無腦化,也許會造成比較尷尬的情況。
最近我們看到了一例典型:TapTap上有位用戶對某款 游戲 進行了一頓吐槽,結果該 游戲 的官方客服,留下了一句「 感謝支持 」。當時就有人質疑客服是機器人,另外還有人覺著回復來得毫不過腦。還有句話,我印象特別深刻: 玩家都已經騎到你臉上了,怎麼還跟人家說謝謝。
這並非客服與用戶的常態交互場景。但留言區中的每一處客服細節,到底還是能讓玩家感受到 游戲 廠商的用心程度。
「裝死」的客服,或許比機器人更糟糕
有時候,某些 游戲 廠商面對負面評價的處理方式,是「 無為 」。在這種思路之下,落到客服層面的具體工作,便是減少回應,甚至是不做回應。由此,讓玩家的消極情緒隨時間去了。
但葡萄君認為,玩家可能會不喜歡「缺乏人味」的客服,但一定會把「沒有人」的客服,拉黑。 我們不倡導冷處理的回應方式,此為下下策 。當問題出現後,玩家需要的,是官方的釋疑和態度——這是誠意的體現,也是人情味的流露。但更重要的,客服需要出面引導輿論,避免輿論被意料之外的節奏帶走。
我們發現,TapTap上有一款安裝量超過90萬的放置手游,近期在客服工作上,沒有讓玩家感到十分滿意。被服務的一端,認為官方沒有正面回應自己問題和需求,甚至嚴格管控論壇,禁止負面言談。這讓玩家覺得,這個 游戲 的客服質量有所下降。
游戲 的官方在後來登了一條帖子,對玩家的吐槽做了回應,並希望大家能理性看待客服的工作。但葡萄君覺得,他們的工作做得或許還不夠到位,至少,放著評論區中的消極情緒任意發酵了幾天,總歸是不好的。
回頭看看過去,便有前車之鑒:曾經有些 游戲 ,運營上出了事故,結果客服回應冷淡,官方動作緩慢,導致玩家集體被激怒,最後做出「開發票」或是「舉報」等比較極端的行為跡飢。
把話說得極好聽,卻未必有人情味
葡萄君在生活中,並不喜歡禮貌的、漂亮的場面話—— 這些話用詞用字很精挑細選,卻總給人一種逢場作戲的意味。 而我們要說的第二種缺乏人情味的客服回應,就存在於這種修飾感極強的話術中。
此前有一個例子,是在 游戲 葡萄編輯部有過討論的。這個例子說的是一款知名IP改編的SLG。 游戲 上線時,它的玩法內容不合粉絲的預期,因此 游戲 在這方面,損失了一些口碑。但官方客服的積極性,是讓人看得見的,幾乎每一條負面評價下,都有客服人員的身影。 但回應的話術、語言、句式,在我們看來,有欠人情味。
其中有些話,在選詞用句方面太過刻意了。以上圖為例,從「感謝領主反饋」到「我們的希望」再到「 一一 記錄」和「爭取加油」—— 我沒法說出這番回應哪裡有不妥 ,它的字斟句酌很是漂亮,但僵直的回答邏輯和各種修飾性的描述用上去之後,會讓人覺得它 流於場面 。
往重了說,便是 「有點假」 。
這番答復形式,在成為不少 游戲 客服的慣用套路後, 玩家更是對其產生了抵抗力 。還是同樣的一款 游戲 ,客服對一位打低星評價的玩家進行了百般恭維,稱呼其為「領主大人」。但這位玩家,在其他 游戲 中當夠了領主大人之後,這回沒有產生很舒適的體驗。
這里舉出另外一個例子,同樣是滿篇的漂亮話,看起來沒什麼問題。但深究起來,卻讓我覺得它是出於模板的套話。這個例子說的是上架TapTap的某款二次元 游戲 ,有位玩家就 游戲 太「肝」這個問題給出了不高的評價,而後官方客服做出了一個篇幅不小的回應,行文中用足了有網感的詞句和符號,而且內容似乎也切中了玩家的問題。
但底下有位玩家,繞開了客服花里胡哨的表述, 直指對方「不說人話」 。
葡萄君認為,自然的、真誠的回應,是 不需要使用太多包裝性的東西 。有些客服自然生發的回應,看起來也許和玩家有沖撞,但我會覺得,這種在生活里稀鬆日常的對話情境,放到虛擬網路中,也依舊會讓人感到鮮活。
這番回應,用的則是比較朴實的文字
頻繁回應,並不等於說是有人情味
有些客服工作者,態度很認真。例如在TapTap中,這樣的客服人員,會逐條掃過差評,回應每一個人的問題。看上去,客服的存在感很高,與玩家的互動工作做得十分到位—— 如果是僅看回應的數量,而不看回應的質量的話。
實際上,葡萄君以為的,那些沒有人情味的客服,他們在高頻率的互動中,往往只是甩下一句簡單、閉環的留言,而 沒有給人充分的對話空間 。這種情況之下,難免就有玩家會質疑:這家客服是不是外包的啊?懂不懂 游戲 呢?是不是只會 CRTL C + CRTL V地完成著自己的日常工作呀? 。
某 游戲 客服,在回應玩家問題時,回復風格比較短平快
葡萄君 沒有否定這類客服工作風格的意思 。只是想說,在認真和勤勉的基礎上,他們或許有做得更好的空間,而這個上升空間,應該就是更深入的了解玩家的需求,與玩家 進行有來有回的溝通 。這番互動盡管會加大客服的工作量,但著實會讓人覺得,我是在跟一個鮮活的人進行對話。
相比短平快的客服風格,這類回復會更具交流感
十天前,某手游公司的CEO,在深夜裡仍在和TapTap的一個用戶進行互動。玩家對該公司旗下的卡牌 游戲 無感,故拋下一星差評。這位CEO見之,沒有放棄讓對方留下,主動和對方溝通。一來一回的互動中,雙方從 游戲 聊到了家庭,聊到了工作。對方可能還是要流失了,但最初有些粗暴的態度為之一轉,並對這位CEO誇贊道 「你們官方說話真的強,服務真到位。 」
你能發現,這位CEO在互動中沒說什麼漂亮話,只是在夜深人靜的時候,試著讓對方理解自家 游戲 的樂趣。但就是一些簡單的、接地氣的文字, 讓對方從中感受到了態度和真誠 。
這位CEO把自己的心得了 朋友圈 。他說: 「每一條差評,我都會跟他嘮嗑嘮到天荒地老,能救一條是一條,這是我們的心得,無關崗位職責。」
讓開發人員來充當客服,也許更顯真誠
有時候,客服之所以顯得不真誠,沒有人情味,就在於回應讓人覺得沒有交流的慾望。而其中的原因,或許是出於客服所能掌握的信息不充分,而無法與玩家進行深度溝通。
比如說,同樣是面對玩家的負面評價,注重效率的客服回應,通常只是說 「感謝支持,會考慮建議」 ;而比較有人情味的客服,會把玩家提出的問題展開,掏出官方自己的思考,說明其中不到位之處,並給出日後的調整方向。
且不論字數多寡,這樣的回復是有信息量的。 而言之有物的內容,對比場面話來說,顯然是更具人情味。
但有一個矛盾點,在於 不是所有客服都那麼了解 游戲 。如果他們只是來收集玩家的反饋,那麼便很難代入自己的 情感 。出於這類情況,客服便無法很好的起到橋梁的作用,因為他們未能掌握問題的核心,又不清楚開發人員的真正想法,以致於留給玩家的答復,往往顯得不痛不癢,說起話來,也像是在跟人踢皮球。
如果情況允許,為何不讓開發參與客服工作中,從中解答一些觸及核心,或者是專業性比較強的問題呢?前不久,葡萄君曾與一位CEO聊起這番話題,他們公司發行的 游戲 ,多數屬於細分領域。他告訴我:「有些時候,玩家很需要開發者出來發聲。你在看這些回復時,會發現一個特點: 開發者的回應通常都很真誠、熱情和努力。」
一名 游戲 製作人向玩家提供建議
相比一個某某 游戲 客服的頭銜來說,某某 游戲 製作人的頭銜,或許更具有說服力。當開發人親自出現出馬與玩家進行溝通,玩家的建議,或許也更容易被聽取和吸納。
做 游戲 ,或許就是做服務
「裝死」、「說場面話」、「缺乏交流感」、「有量無質」、「沒有觸及痛點」等,便是葡萄君在本文中,想就客服工作的「人情味」問題,提醒各個 游戲 廠商需要注意的幾點情況。而我們之所以想強調這些問題,也是因為愈發覺得, 游戲 產業與服務行業幾乎無異,它講究的就是良性互動。
葡萄君曾撰文討論過 游戲 行業到底是不是服務業,當時有位讀者如此回復
上述那些被人忽視的情況,未必會影響 游戲 的正常運營。但想做長期效應的企業,一定會把自己的品牌,當做一個「人」來經營。而要經營一個人,便是要樹立起他的品格和氣質,那麼對於 游戲 廠商來說,要做這些,產品是一方面,服務則是另一方面。
Ⅱ 史上最厲害的黑客是誰
李納斯·托沃茲(Linus Torvalds)
當今世界最著名的電腦程序員、黑客。Linux內核的發明人及該計劃的合作者。托瓦茲利用個人時間及器材創造出了這套當今全球最流行的操作系統內核之一。使自由軟體從產業思想運動演變成為市場商業運動,從此改變了軟體產業,乃至IT產業的面貌。
查德·斯托曼
個人簡介:
圈內頭銜:無 (毫不隱藏!)
主要成就:老牌黑客。1971年,斯托曼在街上找到一份MIT的人工智慧實驗室的工作。當時他是哈佛大學的一名本科生。後來,斯托曼創立了自由軟體基金,打破了軟體是私有財產的概念。
第一次接觸計算機:1969年在IBM 紐約科學中心,時值16歲。
自己獨特的黑客工具:在上世紀 80年代, 斯托曼不拿MIT的薪水但繼續在其中的一個辦公室工作。在那裡他創造了一個新的操作系統GNU--GNU是"GNU's Not Unix"的縮寫。
鮮為人知的事實:曾獲得麥克阿瑟基金24萬美元天才獎。
五短身材,不修邊幅,過肩長發,連鬢鬍子,時髦的半袖沙灘上裝,一副披頭士的打扮。看起來象現代都市裡的野人。 如果他將一件"麻布僧袍"穿在身上,又戴上一頂圓形寬邊帽子,有如繪畫作品中環繞聖像頭上的光環。一眨眼的功夫,他又變成聖經中的耶穌基督的樣子,散發著先知般的威嚴和力量。野人與基督,恰恰就是自由軟體的精神領袖理查德·斯托爾曼的雙重屬性:他既是當今專有(私有)商業軟體領域野蠻的顛覆者,又是無數程序員和用戶心目中神聖的自由之神。
Ⅲ 程序員的代碼潔癖在什麼情況下是一種惡習
當你把【代碼清潔】當作目的時,就是惡習了。為什麼會存在代碼潔癖,究其根本,是我們對「維護代碼」這種讓人抓狂的事情的實際需求,讓我們越來越注意到清潔的重要。比如說 1 == a 這個,如果從來沒有把 a == 1 寫錯成過 a = 1 導致你調式很長時間過,恐怕這個人能難把這個納入到他的潔癖范疇內,即使他對空格的使用要求近乎苛刻。在我的圈子裡面,一直有很多搞單片機的的。這些人主業是做電子甚至是機械的,當需要一個控制器的時候,會用單片機寫一些非常小的程序來實現控制。我發現在這個圈子裡面,就幾乎沒有代碼潔癖的人,別說潔癖了,代碼的基本清潔都看不到,即使這個人在做電路板的時候一板一眼。為什麼?因為沒有需求,代碼本身長度都很小,而且都是寫過無數遍的基本套路,甚至大段大段的代碼都是用輔助工具直接生成的;這些代碼對他們來說,多亂都很難寫錯,並切,最重要的,這些代碼幾乎都不需要維護,因為功能簡單,程序就是可以做到沒有BUG,需要升級的時候也很少。混亂的代碼,於他們的工作效率,幾乎沒有什麼影響;相反,由於開發環境難以想像的簡陋,整理代碼會浪費他們大量時間。既然代碼潔癖是由需求引起的,那麼我們來反思一個問題:我們做的和我們需要的一致么?其實問題問出來的時候,相信大家有答案了,既然用到了「潔癖」,肯定代表「做多了」,《編程之道》這本故事書裡面有個有趣的小故事:一個初學者被要求編寫一個財務軟體。他瘋狂地工作了很多天,但他的主管檢視他的程序時發現,它寫了一個編輯囂,一個圖形程序集,和人工智慧的界面,但是看不到任何跟財務有關的東西。主管要求解釋時,程序員被激怒了:你太沒耐心了,我會在最後寫財務的部分。這就是一個典型程序員在乾的事情,所有的優秀程序員都要經歷這樣的階段,過度設計、過度優化、過度使用技巧等等等等,因為我們就是這樣的群體,對這些的追求就是我們學習編程提高自己的動力,所以我們必然會經歷這樣的事情
Ⅳ C++庫和C庫的區別
C++標准庫非常大。在C++標准中,關於標准庫的規格說明佔了密密麻麻300多頁,這還不包括標准C庫,後者只是 "作為參考"包含在C++庫中。
當然,並非總是越大越好,但在現在的情況下,確實越大越好,因為大的庫會包含大量的功能。標准庫中的功能越多,開發自己的應用程序時能藉助的功能就越多。C++庫並非提供了一切(沒有提供並發和圖形用戶介面的支持),但確實提供了很多。幾乎任何事都可以求助於它。
因
為標准庫中東西如此之多,你所選擇的類名或函數名就很有可能和標准庫中的某個名字相同。為了避免這種情況所造成的名字沖突,實際上標准庫中的一切都被放在
名字空間std中。但這帶來了一個新問題。無數現有的C++代碼都依賴於使用了多年的偽標准庫中的功能,例如,聲明
在<iostream.h>,<complex.h>,<limits.h>等頭文件中的功能。現有軟體沒有針對使
用名字空間而進行設計,如果用std來包裝標准庫導致現有代碼不能用,將是一種可恥行為。
懾
於被激怒的程序員會產生的破壞力,標准委員會決定為包裝了std的那部分標准庫構件創建新的頭文件名。生成新頭文件的方法僅僅是將現有C++頭文件名中的
.h 去掉,方法本櫻此身不重要,正如最後產生的結果不一致也並不重要一樣。所以<iostream.h>變成
了<iostream>,<complex.h>變成了<complex>,等等。對於C頭文件,採用同樣的方法,
但在每個名字前還要添加一個c。所以C的<string.h>變成了<cstring>,<stdio.h>變成
了<cstdio>,等等。最後一點是,舊的C++頭文件是官方所反對使用的(即明確列出不再支持),但舊的C頭文件則沒有(以保持對C的兼
容性)。實際上,編譯器製造商不會停止對客戶現有軟體提供支持,所以可以預計,舊的C++頭文件在未來幾年內還是會被支持。
所以,實際來說,下面是C++頭文件的現狀:
· 舊的C++頭文件名如<iostream.h>將會繼續被支持,盡管它們不在官方標准中。這些頭文件的內容不在名字空間std中。
· 新的C++頭文件如<iostream>包含的基本功能和對應的舊頭文件相同,但頭文件的內容在名字空間std中。(在標准化的過程中,庫中有些部分的細節被修改了,所以舊頭文件和新頭文件中的實體不一定完全對應。)
· 標准C頭文件如<stdio.h>繼續被支持。頭文件的內容不在std中。
· 具有C庫功能的新C++頭文件具有如<cstdio>這樣的名字。它們提供的內容和相應的舊C頭文件相同,只是內容在std中。
所
有這些初看有點怪,但不難習慣它。最大的挑戰是把字元串頭文件理清楚:<string.h>是舊的C頭文件,對應的是基於char*的字元串
處理函數;<string>是包裝了std的C++頭文件,對應的是新的string類;<cstring>是對應於舊C頭文件
的std版本。如果能掌握這些,其餘的也就容易了。
關
於標准庫,需要知道的第二點是,庫中的一切幾乎都是模板。iostream幫助你操作字元流,但什麼是字元?是char嗎?是wchar_t?是
Unicode字元?一些其它的多位元組字元?沒有明顯正確的答案,所以標准庫讓脊返迅你去選。所有的流類(stream
class)實際上是類模板,在實例化流類的時候指定字元類型。例如,標准庫將cout類型定義為ostream,但ostream實際上是一個
basic_ostream<char>類型定義(typedef
)。
類
似的考慮適用於標准庫中其它大部分類。string不是類,它是類模板:類型參數限定了每個string類中的字元類型。complex不是類,它是類模
板:類型參數限定世悉了每個complex類中實數部分和虛數部分的類型。vector不是類,它是類模板。如此不停地進行下去。
在
標准庫中無法避開模板,但如果只是習慣於和char類型的流和字元串打交道,通常可以忽略它們。這是因為,對這些組件的char實例,標准庫都為它們定義
了typedef,這樣就可以在編程時繼續使用cin,cout,cerr等對象,以及istream,ostream,string等類型,不必擔心
cin的真實類型是basic_istream<char>以及string的真實類型是
basic_string<char>。
標
准庫中很多組件的模板化和上面所建議的大不相同。再看看那個概念上似乎很直觀的string。當然,可以基於 "它所包含的字元類型"
確定它的參數,但不同的字元集在細節上有不同,例如,特殊的文件結束字元,拷貝它們的數組的最有效方式,等等。這些特徵在標准中被稱為traits,它們
在string實例中通過另外一個模板參數指定。此外,string對象要執行動態內存分配和釋放,但完成這一任務有很多不同的方法。哪一個最好?選
擇:string模板有一個Allocator參數,Allocator類型的對象被用來分配和釋放string對象所使用的內存。
這里有一個basic_string模板的完整聲明,以及建立在它之上的string類型定義(typedef);可以在<string>頭文件中找到它(或與之相當的什麼東西):
namespace std {
template<class charT,
class traits = char_traits<charT>,
class Allocator = allocator<charT> >
class basic_string;
typedef basic_string<char> string;
}
注意,basic_string的traits
和Allocator參數有預設值。這在標准庫中是很典型的做法。它為使用者提供了靈活性,但對於這種靈活性所帶來的復雜性,那些只想做 "正常"
操作的"典型" 用戶卻又可以避開。換句話說,如果只想使用象C字元串那樣的字元串對象,就可以使用string對象,而不用在意實際上是在用
basic_string<char, char_traits<char>,
allocator<char> >類型的對象。
通常可以這么做,但有時還是得稍稍看看底層。例如,聲明一個類而不提供定義具有優點;它還指出,下面是一種聲明string類型的錯誤方法:
class string; // 會通過編譯,
先不要考慮名字空間,這里真正的問題在於:string不是一個類,而是一個typedef。如果可以通過下面的方法解決問題就太好了:
typedef basic_string<char> string;
但這又不能通過編譯。"所說的basic_string是什麼東西?" 編譯器會奇怪 ---- 當然,它可能會用不同的語句來問你。所以,為了聲明string,首先得聲明它所依賴的所有模板。如果可以這么做的話,就會象下面這樣:
template<class charT> struct char_traits;
template<class T> class allocator;
template<class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> >
class basic_string;
typedef basic_string<char> string;
然
而,你不能聲明string。至少不應該。這是因為,標准庫的實現者聲明的stirng(或std名字空間中任何其它東西)可以和標准中所指定的有所不
同,只要最終提供的行為符合標准就行。例如,basic_string的實現可以增加第四個模板參數,但這個參數的預設值所產生的代碼的行為要和標准中所
說的原始的basic_string一致。那到底該怎麼辦?不要手工聲明string(或標准庫中其它任何部分)。相反,只用包含一個適當的頭文件,
如<string>。
有了頭文件和模板的這些知識,現在可以看看標准C++庫中有哪些主要組件:
· 標准C庫。它還在,還可以用它。雖然有些地方有點小的修修補補,但無論怎麼說,還是那個用了多年的C庫。
· Iostream。和
"傳統"
Iostream的實現相比,它已經被模板化了,繼承層次結構也做了修改,增強了拋出異常的能力,可以支持string(通過stringstream
類)和國際化(通過locales)。當然,你期望Iostream庫所具有的東西幾乎全都繼續存在。也就是說,它還是支持流緩沖區,格式化標識符,操作
子和文件,還有cin,cout,cerr和clog對象。這意味著可以把string和文件當做流,還可以對流的行為進行更廣泛的控制,包括緩沖和格式
化。
·
String。string對象在大多數應用中被用來消除對char*指針的使用。它們支持你所期望的那些操作(例如,字元串連接,通過
operator[]對單個字元進行常量時間級的訪問,等等),它們可以轉換成char*,以保持和現有代碼的兼容性,它們還自動處理內存管理。一些
string的實現採用了引用計數,這會帶來比基於char*的字元串更佳的性能(時間和空間上)。
·
容器。標准庫提供了高效的容器實現:vector(就象動態可擴充的數組),list(雙鏈表),queue,
stack,deque,map,set和bitset。但多少可以作為補償的一點是,
string是容器。這很重要,因為它意味著對容器所做的任何操作對string也適用。
標准庫規定了每個類的介面,而且每條介面規范中的一部分是一套性能保證。所以,舉例來說,無論vector是如何實現的,僅僅提供對它的元素的訪問是不夠的,還必須提供 "常量時間" 內的訪問。如果不這樣,就不是一個有效的vector實現。
很
多C++程序中,動態分配字元串和數組導致大量使用new和delete,new/delete錯誤 ----
尤其是沒有delete掉new出來的內存而導致的泄漏 ----
時常發生。如果使用string和vector對象(二者都執行自身的內存管理)而不使用char*和動態分配的數組的指針,很多new和delete就
可以免於使用,使用它們所帶來的問題也會隨之消失。
· 演算法。標准庫就提供了大量簡易的方法(即,預定義函數,官方稱為演算法(algorithm) ---- 實際上是函數模板),其中的大多數適用於庫中所有的容器 ---- 以及內建數組(built-in arrays)。
算
法將容器的內容當作序列(sequence),每個演算法可以應用於一個容器中所有值所對應的序列,或者一個子序列(subsequence)。標准演算法有
for_each(為序列中的每個元素調用某個函數),find(在序列中查找包含某個值的第一個位置,count_if(計算序列中使得某個判定為真的
所有元素的數量),equal(確定兩個序列包含的元素的值是否完全相同),search(在一個序列中找出某個子序列的起始位置),(拷貝一個
序列到另一個),unique(在序列中刪除重復值),rotate(旋轉序列中的值),sort(對序列中的值排序)。注意這里只是抽取了所有演算法中的
幾個;標准庫中還包括其它很多演算法。
和容器操作一樣,演算法也有性能保證。例如,stable_sort演算法執行時要求不超過0比較級(N log N) 。(stable_sort提供的性能必須和最高效的通用排序演算法在同一個級別。)
· 對國際化的支持。不同的文化以不同的方式行事。和C庫一樣,C++庫提供了很多特性有助於開發出國際化的軟體。但雖然從概念上來說和C類似,其實C++的方法還是有所不同。例如,C++為支持國際化廣泛使用了模板,還利用了繼承和虛函數,這些一定不會讓你感到奇怪。
支
持國際化最主要的構件是facets和locales。facets描述的是對一種文化要處理哪些特性,包括排序規則(即,某地區字元集中的字元應該如何
排序),日期和時間應該如何表示,數字和貨幣值應該如何表示,怎樣將信息標識符映射成(自然的)明確的語言信息,等等。locales將多組facets
捆綁在一起。例如,一個關於美國的locale將包括很多facets,描述如何對美國英語字元串排序,如何以適合美國人的方式讀寫日期和時間,讀寫貨幣
和數字值,等等。而對於一個關於法國的locales來說,它描述的是怎麼以法國人所習慣的方式完成這些任務。C++允許單個程序中同時存在多個
locales,所以一個應用中的不同部分可能採用的是不同的規范。
·
對數字處理的支持。C++庫為復數類(實數和虛數部分的精度可以是float,double或long
double)和專門針對數值編程而設計的特殊數組提供了模板。例如,valarray類型的對象可用來保存可以任意混疊(aliasing)的元素。這
使得編譯器可以更充分地進行優化,尤其是對矢量計算機來說。標准庫還對兩種不同類型的數組片提供了支持,並提供了演算法計算內積(inner
proct),部分和(partial
sum),臨差(adjacent difference)等。
· 診斷支持。標准庫支持三種報錯方式:C的斷言,錯誤號,例外。為了有助於為例外類型提供某種結構,標准庫定義了下面的例外類(exception class)層次結構:
|---domain_error
|----- logic_error<---- |---invalid_argument
| |---length_error
| |---out_of_range
exception<--|
| |--- range_error
|-----runtime_error<--|---underflow_error
|---overflow_error
logic_error(或它的子類)類型的例外表示的是軟體中的邏輯錯誤。理論上來說,這樣的錯誤可以通過更仔細的程序設計來防止。runtime_error(或它的子類)類型的例外表示的是只有在運行時才能發現的錯誤。
可以就這樣使用它們,可以通過繼承它們來創建自己的例外類,或者可以不去管它。沒有人強迫你使用它。
上面列出的內容並沒有涵蓋標准庫中的一切。
標准庫中容器和演算法這部分一般稱為標准模板庫。STL中實際上還有第三個構件 ---- 迭代子(Iterator)。迭代子是指針似的對象,它讓STL演算法和容器共同工作。
STL
是標准庫中最具創新的部分,這並不是因為它提供了容器和演算法(雖然它們非常有用),而是因為它的體系結構。簡單來說,它的體系結構具有擴展性:可以對
STL進行添加。當然,標准庫中的組件本身是固定的,但如果遵循STL構建的規范,可以寫出自己的容器,演算法和迭代子,使它們可以和標准STL組件一起工
作,就象標准組件自身之間相互工作一樣。還可以利用別人所寫的符合STL規范的容器,演算法和迭代子,就象別人利用你的一樣。使得STL具有創新意義的原因
在於它實際上不是軟體,而是一套規范(convention)。標准庫中的STL組件只是具體體現了遵循這種規范所能帶來的好處。
通過使用標准庫中的組件,通常可以避免從頭到尾來設計自己的IO流,string,容器,國際化,數值數據結構以及診斷等機制。這就有更多的時間和精力去關注軟體開發中真正重要的部分:實現軟體的其他功能。