Questions tagged «stl»

标准模板库(STL)是包含通用容器,迭代器,算法和函数对象的C ++库。当C ++标准化时,STL的大部分被标准库所采用,并且标准库中的这些部分有时也被错误地统称为“ STL”。

10
确定地图是否包含键值?
确定STL映射是否包含给定键值的最佳方法是什么? #include <map> using namespace std; struct Bar { int i; }; int main() { map<int, Bar> m; Bar b = {0}; Bar b1 = {1}; m[0] = b; m[1] = b1; //Bar b2 = m[2]; map<int, Bar>::iterator iter = m.find(2); Bar b3 = iter->second; } 在调试器中检查它,看起来就像iter是垃圾数据。 如果我取消注释此行: Bar b2 …
256 c++  stl  map 

8
是否需要std :: unique_ptr <T>知道T的完整定义?
我在标头中有一些代码,如下所示: #include &lt;memory&gt; class Thing; class MyClass { std::unique_ptr&lt; Thing &gt; my_thing; }; 如果我在不包含Thing类型定义的cpp中包含此标头,则无法在VS2010-SP1下编译: 1&gt; C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ include \ memory(2067):错误C2027:使用未定义类型'Thing' 替换std::unique_ptr为std::shared_ptr并编译。 因此,我猜测这是当前VS2010 std::unique_ptr的实现,需要完整的定义,并且完全依赖于实现。 还是?标准要求中是否有某些内容使得的实现无法std::unique_ptr仅与前向声明一起使用?感觉很奇怪,因为它只应持有一个指向的指针Thing,不是吗?

13
对自定义对象的向量进行排序
如何对包含自定义(即用户定义)对象的向量进行排序。 可能应该使用标准STL算法排序以及将对自定义对象中的某个字段(作为排序的键)进行操作的谓词(函数或函数对象)。 我在正确的轨道上吗?
248 c++  stl  sorting 

17
如何从std :: map检索所有键(或值)并将其放入向量中?
这是我出现的可能方法之一: struct RetrieveKey { template &lt;typename T&gt; typename T::first_type operator()(T keyValuePair) const { return keyValuePair.first; } }; map&lt;int, int&gt; m; vector&lt;int&gt; keys; // Retrieve all keys transform(m.begin(), m.end(), back_inserter(keys), RetrieveKey()); // Dump all keys copy(keys.begin(), keys.end(), ostream_iterator&lt;int&gt;(cout, "\n")); 当然,我们还可以通过定义另一个函子RetrieveValues从映射中检索所有值。 还有其他方法可以轻松实现这一目标吗?(我一直想知道为什么std :: map不包含成员函数供我们这样做。)
246 c++  dictionary  stl  stdmap 

10
如何总结C ++向量的元素?
找到元素中所有元素之和的好方法是什么std::vector什么? 假设我有一个std::vector&lt;int&gt; vector包含几个元素的向量。现在,我想找到所有元素的总和。相同的不同方式有哪些?
240 c++  stl  vector 


16
STL中的向量与列表
我在有效STL中注意到 向量是默认情况下应使用的序列类型。 什么意思 似乎无视效率vector无能为力。 有人可以给我提供vector一个不可行的方案,但list必须使用的方案吗?
238 c++  list  vector  stl 


2
为什么不能将unique_ptr推回向量中?
该程序有什么问题? #include &lt;memory&gt; #include &lt;vector&gt; int main() { std::vector&lt;std::unique_ptr&lt;int&gt;&gt; vec; int x(1); std::unique_ptr&lt;int&gt; ptr2x(&amp;x); vec.push_back(ptr2x); //This tiny command has a vicious error. return 0; } 错误: In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/mingw32/bits/c++allocator.h:34:0, from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/allocator.h:48, from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/memory:64, from main.cpp:6: c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/unique_ptr.h: In member function 'void __gnu_cxx::new_allocator&lt;_Tp&gt;::construct(_Tp*, const _Tp&amp;) [with _Tp = std::unique_ptr&lt;int&gt;, _Tp* …


15
C ++排序和跟踪索引
我希望使用C ++和希望的标准库,以升序对样本序列进行排序,但是我也想记住新样本的原始索引。 例如,我有一个样本集,向量或矩阵A : [5, 2, 1, 4, 3]。我想将它们排序为 B : [1,2,3,4,5],但我也想记住这些值的原始索引,因此我可以得到另一个集合,该集合将是: C : [2, 1, 4, 3, 0 ]-对应于原始元素“ B”中每个元素的索引。一个'。 例如,在Matlab中,您可以执行以下操作: [a,b]=sort([5, 8, 7]) a = 5 7 8 b = 1 3 2 谁能看到一个很好的方法来做到这一点?
216 c++  sorting  stl  indexing 

22
是std :: vector比纯数组慢得多吗?
我一直认为这std::vector是“作为数组实现” 的一般常识,等等等等。今天我去测试了它,但事实并非如此: 以下是一些测试结果: UseArray completed in 2.619 seconds UseVector completed in 9.284 seconds UseVectorPushBack completed in 14.669 seconds The whole thing completed in 26.591 seconds 大约慢了3到4倍!对于“ vector可能会慢一些纳秒”的注释并没有真正的道理。 和我使用的代码: #include &lt;cstdlib&gt; #include &lt;vector&gt; #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;boost/date_time/posix_time/ptime.hpp&gt; #include &lt;boost/date_time/microsec_time_clock.hpp&gt; class TestTimer { public: TestTimer(const std::string &amp; name) : name(name), …
212 c++  arrays  performance  stl  vector 

13
为什么C ++ STL如此大量地基于模板?(而不是在* interfaces *上)
我的意思是,除了它的专有名称(标准模板库)之外... C ++最初打算将OOP概念呈现到C中。也就是说,您可以根据其类和类层次结构来判断特定实体可以做什么和不可以做什么(无论它如何执行)。由于多重继承的问题,某些能力组合很难用这种方式描述,而且C ++以某种笨拙的方式(与Java等相比)支持接口的概念,但是它确实存在(并且可能是改进)。 然后,模板与STL一起发挥作用。STL似乎采用了经典的OOP概念,并使用模板来冲洗它们。 在使用模板来泛化类型的情况之间应该有所区别,其中类型主题与模板的操作无关(例如,容器)。有一个vector&lt;int&gt;完美的意义。 但是,在许多其他情况下(迭代器和算法),模板化类型应遵循“概念”(输入迭代器,正向迭代器等),其中概念的实际细节完全由模板的实现定义函数/类,而不是模板使用的类型的类,这在某种程度上是对OOP的反使用。 例如,您可以告诉函数: void MyFunc(ForwardIterator&lt;...&gt; *I); 更新:由于原始问题尚不清楚,因此可以将ForwardIterator本身进行模板化以允许任何ForwardIterator类型。相反,将ForwardIterator作为概念。 仅通过查看其定义就可以期待一个正向迭代器,您需要在其中查看实现或以下文档: template &lt;typename Type&gt; void MyFunc(Type *I); 我可以支持使用模板的两个主张:通过为每种使用的类型量身定制模板,而不是使用vtable,可以使编译后的代码更高效。模板可以与本机类型一起使用的事实。 但是,我正在寻找一个更深层的原因,为什么放弃传统的OOP来支持使用STL?(假设您读到了这么远:P)
211 c++  oop  templates  stl 



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.