【发布时间】:2015-08-10 21:59:35
【问题描述】:
我正在实现一个游戏,我正在寻找一个合适的容器来模拟一堆卡片。
强制条件:
- 容器可以随机打乱(需要
random iterators,不包括std::list) - 容器可以分类
- 可以弹出第一个元素(从顶部抽一张牌)
- 可以在末尾插入元素(将卡片丢弃到底部)
到目前为止,我使用的是std::vector<District>,其中District 是代表卡值的enum class。
#include <vector>
#include <algorithm>
namespace Citadel
{
enum class District
{
UNINITIALIZED,
FORTRESS,
MANOR,
// etc
};
class DistrictDeck
{
public:
void Setup(const std::vector<District>& availableDistricts)
{
// Simplified filling...
for (const auto district : availableDistricts)
{
pileOfCards_.push_back(district);
}
// Once all cards have been pushed, shuffle them
std::random_shuffle(std::begin(pileOfCards_), std::end(pileOfCards_));
}
// Pick a district card from top of the stack
District Draw()
{
District district = District::UNINITIALIZED;
if (pileOfCards_.size() > 0)
{
district = pileOfCards_.front();
pileOfCards_.erase(std::begin(pileOfCards_));
}
return district;
}
// Put a district card below the bottom of the stack
void Discard(const District district)
{
pileOfCards_.push_back(district);
}
private:
std::vector<District> pileOfCards_;
};
}
int main()
{
}
在我的确切情况下,哪个容器可以替换 std::vector?
【问题讨论】:
-
std::vector很好,但您可能还想看看std::deque。 -
由于卡片是小东西,我只使用固定大小的数组。 C++ 程序员还记得如何使用“原始”数组,不是吗?
-
@LeeDanielCrocker,一些
DistrictDeck实例可以有更多或更少的卡片,我更喜欢坚持使用动态容器。我知道我可以模板类来构建一个定制的数组,但我喜欢保持较低的维护工作量。 -
使用
vector作为循环缓冲区,即保留起始和结束索引。它比deque更好,因为在您的情况下,最大卡片数是有界的,
标签: c++ algorithm c++11 optimization stl