2013-10-19 107 views
3

我正在嘗試解決與此類似的問題:Throwing cards away。我的問題唯一的變化是我不需要丟棄卡片的順序。我只想要剩下的最後一張牌。刪除並推回C++中的矢量元素

#include <iostream> 
#include <cstdio> 
#include <vector> 
using namespace std; 
int main(void) 
{ 
    int n, i; 
    while ((scanf ("%d", &n) == 1) && n != 0) 
    { 
     vector<int> cards; 
     for (i = 1; i <= n; ++i) 
     { 
      cards.push_back(i); 
     } 
     while (cards.size() != 1) 
     { 
      cards.erase(cards.begin()); 
      cards.push_back(cards.front()); 
     } 
     printf ("%d\n", cards.at(1)); 
    } 
    return 0; 
} 

這是我第一次使用vector和所有相關的STL功能。我檢查了this並且它說erase函數刪除了一個向量元素。所以while循環應該繼續減小vector的大小,直到變爲1。但是我沒有得到一個輸出來運行這個。我認爲這是因爲無限循環,所以我嘗試在每次迭代中打印vector的大小,並且看到僅縮小了一次。所以這導致了無限循環。但我不明白爲什麼它不會進一步減少。

回答

2

你的矢量的大小永遠不會下降到1,因爲你不移動前卡,而是將其複製到矢量的末尾。 cards.push_back(cards.front())將尺寸增加1。如果你的目標是前卡移至載體的背面,然後交換兩行:

while (cards.size() != 1) 
    { 
     cards.push_back(cards.front()); 
     cards.erase(cards.begin()); 
    } 

這不會降低課程的大小。

編輯:這是建議的解決方案,其中移除前方卡和移動下一張卡到甲板(矢量)的底部。

while (cards.size() != 1) 
    { 
     cards.erase(cards.begin()); 
     cards.push_back(cards.front()); 
     cards.erase(cards.begin()); 
    } 

在每次迭代中,大小將有效減少1。

+0

不除第一元件和第二複製到盡頭? – simonc

+0

是的,該關鍵字*複製*,不移動。所以第一個被刪除,它將向量大小減1,但複製再次將大小加1。 –

+0

@IgorPopov是否有任何可以移動元素而不是複製它的STL函數? – reb94

2
while (cards.size() != 1) 
    { 
     cards.erase(cards.begin()); // cards.size() goes down 
     cards.push_back(cards.front()); // cards.size() goes up 
    } 
0

如果你只需要保持向量中的最後一個元素,那麼你可以寫

if (!cards.empty()) cards.erase(cards.begin(), std::prev(cards.end()));