我想實作一種演算法,該演算法基本上將每個值(除了最后一個)向左移動一個位置,因為第一個元素變成了第二個元素,依此類推。
我已經這樣實作了:
for(int i = 0; i < vct.size() - 1; i ){
vct[i] = vct[i 1];
}
哪個有效,但我只是想知道是否有更快、可選更短的方法來實作相同的結果?
編輯:我犯了一個錯誤,我說我希望它向右移動,而實際上我希望它向左移動,很抱歉造成混亂,并感謝大家指出這一點。我還事先檢查了向量是否為空,只是沒有將其包含在片段中。
uj5u.com熱心網友回復:
正如評論(或不止一個?)所指出的,這里明顯的選擇是只使用std::deque.
另一種可能性是使用回圈緩沖區。在這種情況下,您通常會有一個指向集合中第一個和最后一個專案的索引(或指標)。從開頭洗掉一個專案包括增加該索引/指標(并將其環繞到您已經到達緩沖區末尾的開頭)。無論集合大小如何,這都是相當快且恒定的時間。有一個缺點是,每次添加專案、洗掉專案或查看專案時,都需要做一些額外的數學運算。但它通常只是一個添加,因此開銷非常小。圓形緩沖區作業得很好,但它們有相當多的極端情況,所以讓它們恰到好處通常是一種痛苦。更糟糕的是,許多明顯的實作浪費了一個資料項的插槽(盡管這通常無關緊要)。
一個稍微簡單一點的可能性是通過一些常數因子來減少開銷。為此,請使用一個小包裝器來跟蹤集合中的第一個專案,以及您的專案向量。當您想洗掉第一項時,只需增加跟蹤第一項的變數即可。當您達到某個預設限制時,您會一次性擦除前 N 個元素。這將轉移專案所花費的時間減少了 N 倍。
template <class T>
class pseudo_queue {
std::vector<T> data;
std:size_t b;
// adjust as you see fit:
static const int max_slop = 20;
void shift() {
data.erase(data.begin(), data.begin() b);
}
public:
void push_back(T &&t) { data.push_back(std::move(t); }
void pop_back() { data.pop_back(); }
T &back() { return data.back(); }
T &front() { return data[b]; }
void pop_front() {
if ( b > max_slop) shift();
}
std::vector<T>::iterator begin() { return data.begin() b; }
std::vector<T>::iterator end() { return data.end(); }
T &operator[](std::size_t index) { return data[index b]; }
};
如果你想變得非常棘手,你可以稍微改變一下,這樣你就可以計算max_slop為集合中資料大小的百分比。在這種情況下,您可以更改所涉及的計算復雜性,而不僅僅是讓它保持線性,而是使用比當前更大的常數因子。但我不知道你有多少(如果有的話)關心這個——只有當你處理各種尺寸時,它才可能很重要。
uj5u.com熱心網友回復:
假設您的真正意思是向右移動資料,并且您的代碼有錯誤,那么您可以使用std::move_backwardsfrom<algorithms>和它的兄弟std::move來執行此操作,但是向后訪問資料可能效率低下。
std::move_backward(vct.begin(),vct.end()-1,vct.end());
如果您實際上是要向左移動資料,則可以使用std::move
std::move(vct.begin() 1,vct.end(),vct.begin())
您也可以使用std::copyandstd::copy_backward代替,如果您的物件是可簡單復制的,則語法完全相同,并且對于可簡單復制的物件(堆疊物件)會更快。
你可以在右邊做一個正常的回圈,假設 vct.size() 大于 1。
int temp1 = vct[0]; // assume vct of int
int temp2; // assume vct of int
for(int i = 0;i<vct.size() - 1;i ){
temp2 = vct[i 1];
vct[i 1] = temp1;
temp1 = temp2;
}
如果您向左移動,您的版本就是要做什么。
同樣如評論中所述,如果您正在執行回圈版本,則應檢查您的串列是否為空。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/530043.html
標籤:C 算法表现循环向量
