我一直在使用std::vector ,最近我问自己这个问题:“ std::vector如何实现? 我有两个select: 1)链接列表,然后使API感觉像随机访问(即重载operator[] )。 2)使用new ,例如Foo* temp = new Foo[20] :我相信他们做了这样的事情,但是这引发了更多的问题。 他们总是分配一个最大( uint32_t )存储来给随机访问? (这在内存方面效率低下。) 或者还有什么我应该知道的?
我在Windows和Mac之间编写了一些跨平台的代码。 如果list :: end()“返回一个迭代器来处理列表中最后一个元素的后续位置”,并且可以在向前遍历列表时检查,那么向后遍历的最好方法是什么? 此代码在Mac上工作,但不在Windows上(不能超出第一个元素): list<DVFGfxObj*>::iterator iter = m_Objs.end(); for (iter–; iter!=m_Objs.end(); iter–)// By accident discovered that the iterator is circular ? { } 这在Windows上工作: list<DVFGfxObj*>::iterator iter = m_Objs.end(); do{ iter–; } while (*iter != *m_Objs.begin()); 是否有另一种可以在for循环中实现的向后遍历?
我们的编码指南更喜欢const_iterator ,因为它们比正常的iterator要快一些。 当你使用const_iterator时,编译器看起来好像优化了代码。 这真的是对的吗? 如果是的话,真正发生在内部的是什么让const_iterator更快? 编辑:我写了小testing检查const_iterator与iterator ,发现不同的结果: 对于迭代10,000个对象, const_terator要花费几毫秒(大约16毫秒)。 但并不总是 。 有两个迭代是平等的。
(当我说STL时,我正在讨论围绕容器,迭代器,algorithm和仿函数的模板库。) 这个问题想到了std::string行为就像一个普通的容器,其中包括begin和end函数(包括迭代器),一个函数的size以及将所有这些函数用于容器/范围通过它们的迭代器(例如transform , sort , find等)。 然而,与此同时,它不是一个容器本身,因为它不适合存储任意数据的容器图片。 另外,它主要通过成员函数(如substr , find_first_of等)对包含的数据进行操作,而真正的容器不会这样做,并让algorithm处理它。 另外, cplusplus参考站点和C ++标准没有将std::string与真实容器一起列出,而是在不同的类别中。 但是,在SGI的STL站点上 , basic_string (以及string typedef)与另一个容器和basic_string引用站点一起提到它属于“容器”类别。 现在我的问题是, string实际上是STL的一部分,还是它本身是一个独特的库? 如果它现在属于STL,是不是和Stepanov开发的原始STL有所不同呢?
我目前正在尝试使用stl-datastructures。 但是,我仍然不确定何时使用哪一个,何时使用某个组合。 目前我想弄清楚,当使用std::multimap确实有道理。 就我所见,通过组合std::map和std::vector ,可以轻松地构build自己的multimap实现。 所以我留下了这些数据结构应该被使用的问题。 简单性:std :: multimap使用起来更简单,因为不需要处理额外的嵌套。 但是,作为批量元素访问一系列元素可能需要将数据从迭代器复制到另一个数据结构(例如std::vector )。 速度:vector的局部性最有可能使迭代在相等元素的范围上更快,因为caching使用被优化。 不过,我猜测, std::multimaps也有很多优化技巧背后,尽可能快地迭代相同的元素。 同样,正确的元素范围可能会被优化为std::multimaps 。 为了尝试速度问题,我使用下面的程序做了一些简单的比较: #include <stdint.h> #include <iostream> #include <map> #include <vector> #include <utility> typedef std::map<uint32_t, std::vector<uint64_t> > my_mumap_t; const uint32_t num_partitions = 100000; const size_t num_elements = 500000; int main() { srand( 1337 ); std::vector<std::pair<uint32_t,uint64_t>> values; for( size_t i = 0; […]
我相信std::sort的C ++标准不能保证已经sorting的列表上的O(n)性能。 但是,我仍然想知道在执行sortingalgorithm之前,是否对STL(GCC,MSVC等)的任何实现进行std::is_sorted检查? 问另一种方式,什么样的性能可以期望(当然没有保证)在一个已sorting的容器上运行std::sort ? 注意:我在博客上发布了 C ++ 0x的GCC 4.5的一些基准testing 。 结果如下:
具有std::allocator标准容器的size_type定义为std::size_t 。 然而,是否有可能有一个分配器的大小不能用size_t表示的对象? 换句话说, size_type是否可以比size_t ?
有人可以告诉我的STL堆函数像make_heap的重点? 为什么有人会使用它们? 有实际用途吗?
STLalgorithm在C ++中是非常有用的。 但是有一件令我厌恶的事情是他们似乎缺乏组合性。 例如,假设我有一个vector<pair<int, int>>并且想要将其转换为仅包含对的second成员的vector<int> 。 这很简单: std::vector<std::pair<int, int>> values = GetValues(); std::vector<int> result; std::transform(values.begin(), values.end(), std::back_inserter(result), [] (std::pair<int, int> p) { return p.second; }); 或者,也许我想过滤只有那些first成员是偶数的vector 。 也很简单: std::vector<std::pair<int, int>> values = GetValues(); std::vector<std::pair<int, int>> result; std::copy_if(values.begin(), values.end(), std::back_inserter(result), [] (std::pair<int, int> p) { return (p.first % 2) == 0; }); 但是如果我想要这样做呢? 没有transform_ifalgorithm,使用transform和copy_if似乎需要分配一个临时vector来保存中间结果: std::vector<std::pair<int, int>> […]
我想实现一个类似于std::transformalgorithm的函数,而不是通过我想创build的参数取得输出迭代器,并返回一个带有已转换input元素的容器。 假设它被命名为transform_container并且有两个参数:容器和函子。 它应该返回相同的容器types,但可能通过不同的元素types进行参数化(Functor可以返回不同types的元素)。 我想使用我的function,如下面的例子: std::vector<int> vi{ 1, 2, 3, 4, 5 }; auto vs = transform_container(vi, [] (int i) { return std::to_string(i); }); //vs will be std::vector<std::string> assert(vs == std::vector<std::string>({"1", "2", "3", "4", "5"})); std::set<int> si{ 5, 10, 15 }; auto sd = transform_container(si, [] (int i) { return i / 2.; }); //sd will […]