Questions tagged «stl»

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

7
如何使用以用户定义类型为键的std :: maps?
我想知道为什么不能将STL映射与用户定义的类一起使用。当我编译下面的代码时,我收到以下神秘的错误消息。这是什么意思?此外,为什么仅在用户定义的类型中发生这种情况?(将原始类型用作键时可以使用。) C:\ MinGW \ bin .. \ lib \ gcc \ mingw32 \ 3.4.5 ........ \ include \ c ++ \ 3.4.5 \ bits \ stl_function.h ||在成员函数`bool std ::中less <_Tp> :: operator()(const _Tp&,const _Tp&)const [with _Tp = Class1]':| C:\ MinGW \ bin .. \ lib \ gcc \ mingw32 \ …

8
初始化字符串的向量数组
可以初始化字符串的向量数组。 例如: static std::vector<std::string> v; //声明为班级成员 我static只是用来初始化并用字符串填充它。或者,如果不能像常规数组那样初始化它,我应该在构造函数中填充它。
73 c++  stl 


8
Endianness什么时候成为一个因素?
据我了解,字节序是指组成多字节字的字节的顺序不同,至少在最典型的情况下如此。这样16位整数可以存储为0xHHLL或0xLLHH。 假设我没有记错,我想知道的是,Endianness何时成为在两台计算机之间(Endian可能不同)的主要因素,而Endian可能不同。 如果我以char数组的形式传输短整数1,并且没有进行任何更正,是否接收并将其解释为256? 如果我使用以下代码分解和重新组合短整数,则字节序将不再是一个因素吗? // Sender: for(n=0, n < sizeof(uint16)*8; ++n) { stl_bitset[n] = (value >> n) & 1; }; // Receiver: for(n=0, n < sizeof(uint16)*8; ++n) { value |= uint16(stl_bitset[n] & 1) << n; }; 是否存在补偿字节序的标准方法? 提前致谢!

5
std :: set和std :: vector有什么区别?
我正在学习STL。我读了关于set容器的文章。我有什么疑问要使用set?阅读set的描述后,它似乎没有用,因为我们可以用代替它vector。您能否说说vectorvsset容器的优缺点。谢谢
71 c++  stl 

7
C ++ std :: set更新很乏味:我无法就地更改元素
我发现std::set乏味的更新操作是因为cppreference上没有这样的API 。所以我目前正在做的事情是这样的: //find element in set by iterator Element copy = *iterator; ... // update member value on copy, varies Set.erase(iterator); Set.insert(copy); 基本上,迭代器return bySet是a const_iterator,您不能直接更改其值。 有一个更好的方法吗?或者,也许我应该std::set通过创建自己的方法来覆盖(我不知道它是如何工作的。)
71 c++  stl  set 

6
为什么大多数STL实现中的代码如此复杂?
STL是C ++世界的重要组成部分,大多数实现源自Stepanov和Musser的初步努力。 我的问题是代码的关键性,它是人们出于敬畏和学习目的而查看编写良好的C ++示例的主要来源之一:为什么STL的各种实现如此令人讨厌地看待-令人费解的和从美学的角度讲,通常是很好的例子,说明如何不编写C ++代码。 下面的代码示例由于在变量命名,布局,宏以及使用运算符等方面的原因而无法在我工作过的地方通过代码审查,这些操作不仅仅需要一目了然才能弄清实际情况。 template<class _BidIt> inline bool _Next_permutation(_BidIt _First, _BidIt _Last) { // permute and test for pure ascending, using operator< _BidIt _Next = _Last; if (_First == _Last || _First == --_Next) return (false); for (; ; ) { // find rightmost element smaller than successor …
71 c++  stl  readability 

7
向量或地图,使用哪一个?
我听过很多人说,如果容器中期望的元素数量相对较少,那么最好使用std::vector而不是std::map使用容器,即使您仅将容器用于查找而不是迭代。 这背后的真正原因是什么? 显然,的查询性能std::map不会比std::vector(尽管可能会相差十亿分之一秒/微秒)差,但是它与内存使用情况有关吗? 是否std::vector比分std::map段虚拟地址空间更好/更糟糕? 我正在使用Visual Studio附带的STL库(即Microsoft的实现)。与其他实现相比,这有什么区别吗?
71 c++  performance  stl 

5
为什么使用mingw gcc4.8.1的std :: random_device每次运行都得到相同的序列?
我使用以下代码来测试C ++<random>库。 为什么每次编译的可执行文件都会得到完全相同的序列?是rd()在编译时确定的?每次运行如何获得不同的输出? Windows 7 64位上的GCC 4.8.1。使用http://nuwen.net/mingw.html中的MinGW分发。 编辑:我用Visual Studio测试了相同的代码。没有问题。输出是不确定的。这可能是我使用的mingw gcc 4.8.1中的错误。 #include <iostream> #include <random> using namespace std; int main(){ random_device rd; mt19937 mt(rd()); uniform_int_distribution<int> dist(0,99); for (int i = 0; i< 16; ++i){ cout<<dist(mt)<<" "; } cout <<endl; }
70 c++  c++11  random  stl 

8
如果递增等于STL容器的最终迭代器的迭代器会发生什么
如果将指向向量的最后一个元素的迭代器加2,该怎么办?在这个问题中,如何通过2个元素将迭代器调整为STL容器,提供了两种不同的方法: 要么使用一种形式的算术运算符-+ = 2或++两次 或使用std :: advance() 当迭代器指向STL容器的最后一个元素或其他元素时,我已经用VC ++ 7测试了它们的边缘情况: vector<int> vec; vec.push_back( 1 ); vec.push_back( 2 ); vector<int>::iterator it = vec.begin(); advance( it, 2 ); bool isAtEnd = it == vec.end(); // true it++; // or advance( it, 1 ); - doesn't matter isAtEnd = it == vec.end(); //false …
70 c++  stl  vector  iterator 


4
为什么在Herb Sutter的CppCon 2014演讲(返回基础知识:现代C ++风格)中不建议采用赋值设置器成员函数?
在Herb Sutter的CppCon 2014演讲“回到基础:现代C ++风格”中,他在幻灯片28(此处是幻灯片的网络副本)上提到了这种模式: class employee { std::string name_; public: void set_name(std::string name) noexcept { name_ = std::move(name); } }; 他说这是有问题的,因为当用临时调用set_name()时,noexcept-ness并不强(他使用短语“ noexcept-ish”)。 现在,我在自己最近的C ++代码中已经大量使用了上述模式,主要是因为它使我每次都不必键入两个set_name()副本-是的,我知道每次强制执行一个副本构造可能会有点效率低下,但嘿,我是一个懒惰的打字员。但是,Herb的短语“ this noexcept有问题”令我担心,因为我在这里没有遇到问题:std :: string的移动赋值运算符是noexcept,它的析构函数也是如此,因此对我来说,上面的set_name()似乎可以保证noexcept。我确实在编译器准备参数时在set_name()之前看到了潜在的异常抛出,但是我正在努力将其视为有问题的。 后来在幻灯片32上,赫伯清楚地指出以上内容是反模式。有人可以向我解释为什么我懒得写不好的代码吗?
70 c++  c++11  stl 


4
迭代器的默认值是多少?
对于我正在使用的任何STL容器,如果我使用迭代器的默认构造函数声明一个(此特定容器类型的)迭代器,则该迭代器将初始化为什么? 例如,我有: std::list<void*> address_list; std::list<void*>::iterator iter; 将初始化什么?

8
我应该从使用boost :: shared_ptr切换到std :: shared_ptr吗?
我想在中启用GCC中对C ++ 0x的支持-std=c++0x。在GCC 4.5(以及不久的4.6)中,我并不一定需要任何当前受支持的C ++ 11功能,但是我想开始习惯它们。例如,在一些我使用迭代器的地方,一种auto类型会很有用。 但是同样,我不需要任何当前支持的功能。目的是鼓励我将新标准的功能纳入我的编程“词汇表”中。 从对C ++ 11支持的了解来看,在GCC中启用它,然后例如通过boost::shared_ptr将使用从切换为std::shared_ptr单独使用,而不是两者混合使用,将其包含进来,是一个好主意吗? PS:我知道这个比较不同口味的好问题,shared_ptr但我想在标准定稿之前就使用哪种更高层次的建议提出建议。换句话说,当像GCC这样的编译器说它支持“实验功能”时,是否意味着我很可能在编译期间遇到奇怪的错误,而这将是主要的时间消耗,并且是StackOverflow上的一些神秘问题的来源? 编辑:我std::shared_ptr之所以决定从此退回,因为我不信任它在GCC 4.5中的支持,如本问题中的例子所示。
69 c++  boost  stl  c++11  shared-ptr 

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.