stl相关内容
我找不到这个问题的确切答案,因此在这里发布.当我想到向量时,它需要在连续的内存位置构建对象.这意味着向量保持分配的内存,并且必须对被推入其中的对象进行就地构造(=放置新).这是一个有效的假设吗?另外,这是否意味着容器正在手动调用析构函数而不是调用删除?我在这里缺少任何其他假设吗?这是否意味着我可以假设如果我选择编写,即使是为对象编写的自定义 new 也可能不会被调用? 此外,列表使用 new
..
当一个或两个输入容器是具有重复对象的多重集时,算法 std:set_union 的返回是什么?复制人会迷路吗? 假设例如: multisetms1;ms1.插入(1);ms1.插入(1);ms1.插入(1);ms1.插入(2);ms1.插入(3);多集ms2;ms2.插入(1);ms2.插入(1);ms2.插入(2);ms2.插入(2);ms2.插入(4);向量诉(10
..
假设我有以下对象: struct Foo{int size() { 返回 2;}}; 获取 vector 中所有对象的总 size 的最佳方法是什么(最易于维护、可读等)?我会发布我的解决方案,但我对更好的想法感兴趣. 更新: 到目前为止,我们有: std::accumulate 和仿函数 std::accumulate 和 lambda 表达式 普通的 for
..
作为 constexpr std::字符串和constexpr std::vector 已被 C++20 接受,这些将如何使用?链接的论文在细节上非常短.我们是否需要指定特殊的 constexpr 分配器,使编译时字符串/向量与其正常等效项不兼容? 解决方案 这两篇论文严重依赖P0784,其中讨论了编译时分配的工作方式. 不完整的答案: 只有 std::allocator 可以
..
查看 STL 容器的成员函数时,我想到了一个奇怪的想法.为什么像 std::vector::push_back(T) 这样的函数没有(可选的)返回值(迭代器甚至对附加对象的引用)?我知道像 insert 和 erase 这样的 std::string 函数会返回迭代器,但这是出于显而易见的原因.我认为它通常会在这些函数调用之后保存第二行代码. 我相信C++的设计者有一个很好的理由,请赐
..
关于C++ stl容器元素的要求,标准规定:元素类型应为CopyConstructible,并有CopyConstructible要求表.同样通过各种书籍(Josuttis 等),生成的副本应该与源“等效". 我想我需要澄清一下.究竟什么是“等同于"?我也对“CopyConstructible"和“深/浅拷贝"之间的关系有点困惑.一般来说,拷贝构造函数要么是浅拷贝,要么是深拷贝.那么哪个适用
..
假设,我有一个 STL 容器 type(不是对象),比如 vector.现在它的 value_type 是 A,所以我想把它改成 B. 基本上,我想要一个这种形式的类模板,或者它的变体: template结构 change_value_type{typedef/*....*/new_container;}; 以便我可以通过以下方式使用它: typename change_value_t
..
我想存储一堆键值对象,但是值对象本身(以及对它的引用)知道它的键.我还想有效地查找仅给定键的这些对象. 类 SomeObject{私人的://字符串或整数.int 似乎足够便宜,可以用 std::map 复制,但是//当可能存在数千个对象时,字符串似乎相当昂贵.//引用/指向键的指针很好const SomeOtherObject 键;...其他的东西...上市:...方法,其中一些以某种方式使用
..
独立的 STL 算法(如 std::count_if)采用一对迭代器.在我使用这些的所有情况下(以及我在网上看到的所有示例!),我发现自己在输入 std::count_if(myContainer.begin(),myContainer.end(),/* ... */); 样式的速记模板有什么原因吗 std::count_if(myContainer,/* ... */); 没有提供,因为
..
stl中的vector之类的容器对象如何被销毁,即使它们是在堆中创建的? 编辑 如果容器持有指针,那么如何销毁这些指针对象 解决方案 指针的 STL 容器不会清理指向的数据.它只会清理保存指针的空间.如果你想让向量清理指针数据,你需要使用某种智能指针实现: {std::vectorv1;v1.push_back(new SomeClass());std
..
有人能指出常用的 C++ STL 容器(如 vector、list、map、set、multimap...)和 C# 通用容器之间的良好映射吗? 我已经习惯了前者,并且不知何故我已经习惯于用这些容器来表达算法.我很难找到与这些等效的 C#. 谢谢! 解决方案 这是一个粗略的等价: 字典 unordered_map HashSet
..
..
如何获取 STL 容器所包含的元素的类型? 解决方案 对于一般容器,它将是 X::value_type.对于关联容器,它将是 X::mapped_type(X::value_type 对应于 pair).符合 C++ 标准第 23 章. 要检查类型是否相等,您可以使用 boost::is_same.从 C++11 开始 — std::is_same.
..
我想将容器内的元素向左或向右移动.移位元素不连续. 例如,我有一个向量 {1,2,3,4,5,6,7,8},我想将 {4,5,7} 向左移动 2 个位置,预期结果将是 {1,4,5,2,7,3,6,8} 有没有优雅的方法来解决它? 解决方案 你可以自己写移位函数.这是一个简单的: #include #include 模板
..
以下代码行编译得很好并且表现良好: listint_pointers;//(1) 以下两行没有: typedef int * IntPtr;列表int_pointers;//(2) 我得到完全相同的编译错误 listint_pointers;//(3) 我很清楚最后一行是不合法的,因为 STL 容器的元素需要是可分配的.为什么编译器
..
关于 https://doc-snapshots.qt.io/qtcreator-extending/coding-style.html 推荐写for循环如下: Container::iterator end = large.end();for (Container::iterator it = large.begin(); it != end; ++it) {//...;} 而不是 for
..
我需要一个这样的模板,效果很好 模板void mySuperTempalte(常量容器 myCont){//在这里做点什么} 然后我想将上面的模板专门用于 std::string 所以我想出了 模板void mySuperTempalte (const 容器 myCont){//检查容器类型//在这里做点什么} 这不起作用,并引发错误.我想让第二个示例工作,然后如
..
是否有任何类似于 itertools.groupby() 的 C++ 转换? 当然,我可以轻松编写自己的代码,但我更喜欢利用惯用行为,或者从 STL 或 boost 提供的功能中组合一个. #include #include #include #include #include 结构体{诠释 x;标准::字符串 y;浮动z;};bool
..
我有以下代码: 结构节点{诠释一个;诠释 b;};节点节点;节点.a = 2;节点.b = 3;地图啊;aa[1]=1;//行.地图bb;bb[节点]=1;//编译错误. 当我尝试将结构 Node 的实例映射到 int 时,出现编译错误.为什么? 解决方案 对于一个可以用作地图键的东西,你必须能够使用 operator
..
std::vector、std::list 和 std::deque 有 std::back_inserter,并且 std::set 有 std::inserter. 对于 std::stack 和 std::priority_queue 我会假设等效的插入器是 push() 但我可以似乎找不到要调用的正确函数. 我的意图是能够将以下函数与正确的插入迭代器一起使用: #includ
..