大佬教程收集整理的这篇文章主要介绍了c – 如何正确(但有效地)实现像“vector :: insert”这样的东西? (指针别名),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
template<class T> // ignore the allocator struct vector { typedef T* iterator; typedef const T* const_iterator; template<class It> void insert(iterator where,It begin,It end) { ... } ... }
问题
我们在这里面临一个微妙的问题:
开头和结尾有可能引用同一向量中的项目,在此之后.
例如,如果用户说:
vector<int> items; for (int i = 0; i < 1000; i++) items.push_BACk(i); items.insert(items.begin(),items.end() - 2,items.end() - 1);
如果它不是指针类型,那我们就没事了.
但是我们不知道,所以我们必须检查[begin,end]是否指向已经在向量内的范围.
但是我们怎么做呢?根据C,如果它们不引用相同的数组,那么指针比较将是未定义的!
所以编译器可能会错误地告诉我们这些项不是别名,实际上它们确实是这样,给了我们不必要的O(n)减速.
潜在的解决方案&警告
一种解决方案是每次复制整个矢量,包括新项目,然后丢弃旧副本.
但是在上面的示例中,这种情况非常缓慢,我们要复制1000个项目只是为了插入1个项目,即使我们显然已经有足够的容量了.
从标准[比较] / 8:
以上是大佬教程为你收集整理的c – 如何正确(但有效地)实现像“vector :: insert”这样的东西? (指针别名)全部内容,希望文章能够帮你解决c – 如何正确(但有效地)实现像“vector :: insert”这样的东西? (指针别名)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。