C 如何用O 1 的時間交換兩個std string字串?

時間 2021-05-11 22:57:22

1樓:西海

auto temp = std::move(s1);

s1 = std::move(s2);

s2 = std::move(temp);

這不是最無腦的辦法嗎

2樓:

swap,沒得說。

我不太贊同memcpy類本身,哪怕swap本身就是這麼實現的。

O(1)就是指交換資料時避免拷貝實際資料,這種功能應該是庫自己負責實現的,並對外提供介面。自己外部做memcpy可能忽視了相容性,也可能失去了執行緒安全/異常安全之類的保障。

不過還有個辦法……存智慧型指標交換?可能執行緒安全都能保障了。

3樓:Milo Yip

無論是標準庫里的:

成員函式 std::basic_string::swap非成員函式 std::swap(std::basic_string)其時間複雜度都是常數。

原理也很簡單,就是交換 裡固定數目的指標及變數,而不需要複製字元。

4樓:劉子昂

實名反對樓上的回答,請不要誤導其他人。

首先你memcpy都寫成memcopy,這個是第乙個錯。

第二個、也是最嚴重的問題就是,直接用memcpy來複製物件是很糟糕的事情,很有可能導致未定義行為。不管這個物件含不含有虛函式或者虛繼承帶來的那幫亂七八糟的東西,都不應該在C++裡用memcpy來複製物件。更正式地說,就是你絕不應該嘗試使用memcpy來複製乙個non-trivially copyable的物件。

第三,稍有常識的人都知道,memcpy的靠譜實現最少也應該是線性複雜度,而題主問的是常數複雜度。

對於題主的問題,我來回答一下,memcpy天地滅,std::swap保平安。搜尋「cppref std::swap」有真相。

5樓:劉俊是

感謝@chys,讓我知道了sso,最新的string標準已經拋棄了cow改用sso,所以下面的回答只適合cow的string。

我覺得有些人一上來就噴memcpy真的比較無語,如果是錯了就給出例項或證據。

現在c++標準庫string的swap操作都是O(1)時間複雜度,最簡單的做法就是直接把2個string類自身進行memcpy操作。指標,長度什麼的通通不用考慮。

對string這麼做應該是沒問題的,只要string的實現沒有什麼大的變化,標準庫本身就提供了2個版本的swap函式,乙個交換ref和size, 乙個直接做memcpy。

查了下資料,現在string已經拋棄了cow,改為sso。

vs2017實現和g++4.8都沒什麼問題

vs2017

g++4.8

5.0以後的g++拋棄了,cow(寫時複製)改用sso(立即複製)

堅果 O1 Pro 的配置好嗎?與堅果 O1 有哪些區別?

靜靜 我六月份買的O1,不是這個pro版本的,說起來就鬧心,估計這個新品也會有同樣的問題,買家秀與賣家秀差距過大,我用之前的慘痛經歷提醒大家謹!慎!入!手!客廳的小電視還在用,本身也沒打算放那兒。但是看下來,好像只有兩個臥室進門的地方可以放,正好床頭對著,比較方便看。但是投在牆上,不知道咋回事,總感...

如何用有限的錢買到更多的時間?AND如何用有限的時間掙更多的錢?

Alice 無論您是想旅行,學習還是想賺錢,都要為自己設定乙個中等難度的目標,讓自己有動力改變現狀,讓自己為之奮鬥。例如,當夜晚已經很深,你的眼睛仍然盯著你手中的電子螢幕時,想想明天的預約旅行,並且預訂了門票。如果延遲延遲,不僅會花錢,而且也是錯誤的。你和你的朋友之間的協議破壞了你的可信度,這樣你就...

python中如何用for語句寫出從1的階乘到20的階乘的加和?

AN DASH 一句話 eval join join s i for i in range j 1 for j in range 21 2 田怡 for i in range 1,20 mut 1 for x in range 1,i mut x num mut using python 3 v1 ...