使用std::vector<Item>
是一個和這裏唯一明智的解決方案。
在另一個答案評論,您要添加這條信息:
的一個問題,但是,是我需要限制大小。我可以自己做到這一點 與載體或我必須手動限制它(例如不讓它 添加更多的項目到矢量一旦它太大)
一個std::vector
是很無限。它唯一的實際限制是可用內存。
但是,無論如何,你應該養成封裝容器類別的習慣。通常情況下,容器類提供了比您在某個特定用例中所需的功能更多的功能。例如,您的items
成員變量可能永遠不需要rbegin()
,cend()
,shrink_to_fit()
, difference_type
,get_allocator()
或pop_back()
,僅舉幾個示例。
因此,很好的做法,建立一個只提供那些你真正需要操作的自定義數據類型,並在std::vector
方面實現自定義數據類型。然後實現額外的約束變得微不足道。
實施例:
#include <vector>
#include <string>
#include <stdexcept>
#include <exception>
#include <iostream>
// just a super-simple example:
struct Item {
std::string name;
};
// wraps std::vector<Item>:
class Items {
public:
Items(int max_size) :
max_size(max_size),
items()
{
}
void Add(Item const& item) {
if (static_cast<int>(items.size()) == max_size) {
throw std::runtime_error("too many items");
}
items.push_back(item);
}
Item Get(int index) const {
return items[index];
}
private:
int max_size;
std::vector<Item> items;
};
int main()
{
Items items(5);
try {
items.Add({ "sword" });
items.Add({ "shield" });
items.Add({ "torch" });
items.Add({ "axe" });
items.Add({ "boots" });
std::cout << items.Get(3).name << "\n";
items.Add({ "gloves" });
} catch (std::exception const& exc) {
std::cerr << exc.what() << "\n";
}
}
注意,這個例子使用例外處理錯誤。這可能不適合您的使用情況;您可以考慮改爲assert
。
你不能,使用'std :: vector- items;'而不是。 –
好的謝謝,生病嘗試。然而,一個問題是我需要限制尺寸。我可以使用矢量來做到這一點,還是我必須手動限制它(例如,一旦它太大,不要讓它向矢量添加更多項目) –
取決於您如何實際將'Items'添加到被插入的矢量/數組中。 –