使用vector需要注意的要点


vector的元素类别T,必须具备assignable和copyable两个性质。


vector的容量很重要:

1. 一旦内存重新配置,和vector元素相关的所有references、pointers、iterators都会失效。

2. 内存重新分配很耗时间。

所以,如果程序管理了和vector元素相关的references、pointers、iterators或执行速度至关重要,就必须考虑容量问题。

可以使用reserve()保留适当容量,避免一再重新分配内存。


可以利用如下语句缩减容量:

std::vector<T>(v).swap(v);


c1 = c2:将c2的全部元素赋值给c1

c.assign(n, elem):复制n个elem,赋值给c

c.assign(beg, end):将区间[beg;end]内的元素赋值给c

c1.swap(c2):将c1和c2元素互换

swap(c1, c2):同上。此为全局函数

上面列出的全部是“将新元素赋值给vectors,并将旧元素全部移除”的方法。


operator[]、front()、back(),不做范围检查,如果发生越界错误,会引发未定义行为。所以使用时,必须确定索引有效。

std::vector<Elem> coll;

if (coll.size() > 5) {

  coll[5] = elem;

}

if (!coll.empty()) {

  cout << coll.front();

}


vector迭代器持续有效,除非发生两种情况:(1)在一个较小索引位置上安插或移除元素;(2)由于容量变化而引起内存重新分配。


移除“与某值相等”的所有元素:

std::vector<Elem> coll;

// remove all elements with value val

coll.erase(remove(coll.begin(), coll.end(), val), coll.end());


只移除“与某值相等”的第一个元素:

std::vector<Elem> coll;

// remove first element with value val

std::vector<Elem>::iterator pos;

pos = find(coll.begin(), coll.end(), val);

if (pos != coll.end()) {

  coll.erase(pos);

}


vector元素分布于连续空间中,所以有:&v[i] == &v[0] + i


千万不要把迭代器当做元素地址来传递,vector迭代器由实作版本定义,也许并不是一般指针。

printf(“%s\n”, v.begin()); // ERROR (might work, but not portable)


如果需要静态大小的bitfield,应当使用bitset,而不是vector<bool>。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值