3

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

#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 函数。我检查了它,它说该erase函数删除了一个向量元素。所以while循环应该不断减小vector直到变成1. 但我没有得到运行这个的输出。我认为这是因为无限循环,所以我尝试vector在每次迭代中打印大小,发现大小只减小了一次。所以这导致了无限循环。但是我不明白为什么它没有进一步减少。

4

3 回答 3

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。

于 2013-10-19T17:58:46.463 回答
2
    while (cards.size() != 1)
    {
        cards.erase(cards.begin()); // cards.size() goes down
        cards.push_back(cards.front()); // cards.size() goes up
    }
于 2013-10-19T18:00:46.357 回答
0

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

if ( !cards.empty() ) cards.erase( cards.begin(), std::prev( cards.end() ) );
于 2013-10-19T18:21:20.103 回答