在C ++中删除和推回向量的元素

时间:2013-10-19 17:54:46

标签: c++ vector

我正在尝试解决与此类似的问题:Throwing cards away。我的问题唯一的变化是我不需要丢弃卡片的顺序。我只想要剩下的最后一张卡。

#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的大小,并看到大小只减少一次。所以这导致无限循环。但是我不明白为什么它没有进一步减少。

3 个答案:

答案 0 :(得分:2)

您的矢量大小永远不会降至1,因为您不移动前卡,而是将其复制到矢量的末尾。 cards.push_back(cards.front())将尺寸增加一个。如果您的目标是将前卡移动到矢量背面,则交换两条线:

    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。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

如果您只需要将最后一个元素保留在向量中,那么您可以编写

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