不使用vector<bool>的原因和替代方法

vector<bool>不是容器,至少,不是标准意义上的容器。

vector<bool>的名称有点让人误解,因为其内部元素实际上并不是标准的bool值,标准的bool值至少与char拥有一样的大小,从而可以被“正常”使用。

然而C++标准对于vector<bool>值有其特殊的实现方法。目的是为了减小空间的耗用。特殊版本内部只使用一个bit来存储一个元素,所以通常要比一般的bool值小8倍之多。


但是这里就带来了一个小麻烦,C++的最小可寻址值通常以byte为单位,所以上述的vector<bool>特殊版本的references和iterators经过了特殊的处理,并不是bool值的实际地址,而是一个“代理对象”。这样,对于一般类可以使用的以下操作:

T* p = &v.front
对于vector<bool>值来说,并不适用。

除此之外,由于vector<bool>通过代理对象进行存取访问时需要执行逐位处理,访问速度通常比int之类的普通类型操作要慢很多。
 
因此,对vecotr<bool>的使用需慎重考虑以下几点:
(1)是否需要牺牲速度来获取空间上的优化
(2)算法中会否有对vecotr地址进行解引用操作的可能。
 
如果不满足以上条件,建议使用deque<bool>来取代vector<bool>,功能基本相同,但deque<bool>未对其进行特殊处理。
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码已经很精简了,但还是可以做一些微调,以下是我建议的改进: 1. 将头文件的顺序改为先算法库再是标准库,遵循头文件依赖关系原则。 2. 结构体 item 可以使用 class 替代,同时将结构体内部的成员变量声明为 private,提高代码的封装性。 3. 为结构体 item 添加构造函数,以便在创建对象时同时初始化成员变量。 4. 在 knapsack 函数中,使用 auto& 而不是 auto 来避免进行不必要的拷贝操作。 5. 在 for 循环中,使用 auto& 而不是 auto 来避免进行不必要的拷贝操作。 6. 将 make_pair 改为 { },可以使代码更加简洁。 修改后代码如下: ``` #include <algorithm> #include <vector> #include <iostream> using std::vector; using std::cout; using std::endl; class Item { public: Item(int w, int v) : weight(w), value(v) {} int getWeight() const { return weight; } int getValue() const { return value; } private: int weight; int value; }; bool cmp(const Item& i1, const Item& i2) { return i1.getValue() * i2.getWeight() > i2.getValue() * i1.getWeight(); } std::pair<int, vector<int>> knapsack(vector<Item>& items, int capacity) { int n = items.size(); vector<int> selected_items(n, 0); int total_value = 0; std::sort(items.begin(), items.end(), cmp); for (auto& item : items) { if (capacity == 0) break; if (item.getWeight() <= capacity) { selected_items.push_back(1); total_value += item.getValue(); capacity -= item.getWeight(); } else { selected_items.push_back(capacity / item.getWeight()); total_value += selected_items.back() * item.getValue(); capacity -= selected_items.back() * item.getWeight(); } } return { total_value, selected_items }; } int main() { vector<Item> items = { {2, 10}, {3, 15}, {5, 20} }; int capacity = 8; auto& result = knapsack(items, capacity); cout << "Total value: " << result.first << endl; cout << "Selected items: "; for (auto& i : result.second) { cout << i << " "; } cout << endl; return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值