stl 相关问题

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

back_inserter 是如何工作的?

我试图了解 back_inserter 是如何工作的,这是我从 SGI-STL 获得的它的实现: 模板 类 back_insert_iterator { 受保护: C*容器; 民众: ...

回答 3 投票 0

如何编写模板/概念来检查类型是否满足指定要求 DefaultInsertable

在实现我自己的forward_list类模板时,我看到一些方法(例如resize())要求类型为DefaultInsertable。 根据文档,DefaultInsertable 特...

回答 1 投票 0

如何解决错误 C2440“初始化”:无法从“_Ty”转换为“_Objty”

我正在尝试编写一种算法来查找具有特定请求总和的给定向量的子集。 我正在尝试使用“竞争

回答 2 投票 0

为什么 std::vector 有 2 个构造函数而不是 1 个带默认参数的构造函数?

我查看了 cppreference.com 并发现了这个 向量(); 显式向量( const Allocator& alloc ); 为什么不只是 显式向量(const Allocator& alloc = Allocator()); 1个构造函数代替...

回答 1 投票 0

尝试获取“import std;”时出错在 CMake 项目中工作

通过遵循 Andreas Weis 关于模块入门的精彩演讲,我成功地让自己的简单模块正常工作,但我在实现自己真正想要实现的目标方面遇到了麻烦,这很重要......

回答 1 投票 0

为什么 make_unique<T[N]>() 非法,而 make_shared<T[N]>() 合法?

shared_ptr的提案中有这样一段: https://www.open-std.org/JTC1/SC22/WG21/docs/papers/2014/n3920.html 不幸的是 unique_ptr 失去了对...的支持

回答 1 投票 0

std::list::remove 方法是否调用每个被删除元素的析构函数?

我有代码: std::list lst; //.... Node * node = /* 从我的节点上的某处获取指针 */; lst.remove(节点); std::list::remove 方法是否调用析构函数(并释放 m...

回答 6 投票 0

高效地将 std::unordered_set 的内容移动到 std::vector

在我的代码中,我有一个 std::unordered_set ,我需要将数据移动到 std::vector 中。我在获取数据时使用 std::unordered_set 以确保在转换之前仅存储唯一值...

回答 2 投票 0

无缝使用具有不同比较器的地图

我使用别名来引用两个地图之一: 地图&map_alias = use_map_a?地图a:地图b; 但随后更改了map_b以使用std::greater作为其比较器(而不是defa...

回答 1 投票 0

无缝使用具有不同比较器的地图

我使用别名来引用两个地图之一: 地图&map_alias = use_map_a?地图a:地图b; 但随后更改了map_b以使用std::greater作为其比较器(而不是defa...

回答 1 投票 0

使用 std::ranges::to 将 std::ranges::lazy_split_view 收集到 std::vector

在 Rust 中,我可以写(Rust Playground): 让 vec = "Hello-+-Rust-+-!".split("-+-").collect::>(); println!("{:?}", vec); // [“你好”,“...

回答 1 投票 0

尝试复制 std::complex 行为,STL 是在骗我还是我错过了什么?

我正在尝试将 std::complex 编写为 HLSL 库。为此,我开始从算术运算符开始实现最基本的功能。对于有限的数字,一切都符合预期。 ...

回答 1 投票 0

如何初始化 const std::pair?

假设我有一个: #包括 使用命名空间 std; typedef 对 my_pair; 如何初始化 const my_pair ?

回答 5 投票 0

向量迭代器不兼容

我有一个带有 std::vector 数据成员的类,例如 类 foo{ 民众: const std::vector getVec(){return myVec;} //省略其他内容 私人的: std::vector myVec; }; 现在...

回答 10 投票 0

C++库求两个unordered_set的交集方法

我有两个 unordered_set 并想要它们的交集。我找不到库函数来做到这一点。 本质上,我想要的是这样的: 无序集 a = {1, 2, 3}; 无序集 我有两个 unordered_set 并且想要它们的交集。我找不到库函数来做到这一点。 本质上,我想要的是这样的: unordered_set<int> a = {1, 2, 3}; unordered_set<int> b = {2, 4, 1}; unordered_set<int> c = a.intersect(b); // Should be {1, 2} 我可以做类似的事情 unordered_set<int> c; for (int element : a) { if (b.count(element) > 0) { c.insert(element); } } 但是,我认为应该有一种更方便的方法来做到这一点。如果没有,有人可以解释一下为什么吗?我知道有 std::set_intersection,但这似乎只对向量起作用。 事实上,基于循环的解决方案是您可以与 std::unordered_set 一起使用的最佳选择。 有一种名为 std::set_intersection 的算法,它允许找到两个 sorted 范围的交集: 构造一个从 d_first 开始的由元素组成的排序范围 在两个排序范围 [first1, last1) 和 [first2, 最后2). 当您处理 std::unordered_set 时,您无法应用此算法,因为std::unordered_set中的元素没有保证顺序。 我的建议是坚持使用循环,因为它明确说明了您想要实现的目标,并且具有线性复杂度(O(N),其中 N 是您使用 for 循环遍历的无序集合中的元素数量)这是您可能实现的最佳复杂性。 正如已接受的答案所解释的那样,直接不能做你想要的事情,并且std::set_intersection不适合交叉std::unordered_set,尽管听起来像这样。理想的解决方案取决于您使用的 C++ 标准。 给定两套std::unordered_set<T> a, b; ... 就地 ...将a转入路口a & b的最佳方法如下: // C++20 (needs <unordered_set>) std::erase_if(a, [&b](int e) { return !b.contains(e); }); // C++11 (needs <unordered_set>) for (auto it = a.begin(); it != a.end();) { if (!b.count(*it)) it = a.erase(it); else ++it; } 不可修改 或者,计算一个新集合 c,其中包含 a 和 b 的交集: // C++23 (needs <unordered_set>, <ranges>) std::unordered_set<int> c(std::from_range, a | std::views::filter([&b](int e) { return b.contains(e); }); // C++20 (needs <unordered_set>, <ranges>) auto view = a | std::views::filter([&b](int e) { return b.contains(e); }; std::unordered_set<int> c(view.begin(), view.end()); // C++11 (needs <unordered_set>) std::unordered_set<int> c; // TODO: consider reserving a size (optimistically |a| + |b|) for (int e : a) { if (b.count(e)) { c.insert(e); } } std 有一个函数称为 set_intersection。但是,使用 std::set 作为输入参数会具有非常高的复杂性。更好的解决方案是,从这些集合中创建两个向量,并使用 set_intersection 和向量作为输入参数。

回答 3 投票 0

为什么STL容器没有通用函数的方法?

我知道迭代器上有一些通用函数可以完成您想要做的所有事情,例如 std::find、std::count 等,但为什么标准容器(例如 std::vec)不可以呢? .

回答 1 投票 0

在地图中添加指向地图中键的指针

静态 std::mapnid; pnode* ptrof(pnode &pn) { auto r = nid.insert( {pn, nullptr} ); if (r.second) { nid[pn] = &(r.first->first); ...

回答 1 投票 0

有什么方法可以让它自动检测 std::array 中的大小<int,5>

模板 void print(const std::array& data){ for(自动它:数据){ std::cout << it << std::endl; } } int main(){ std::array template<typename T, size_t N> void print(const std::array<T,N>& data){ for(auto it : data){ std::cout << it << std::endl; } } int main(){ std::array<int,5> arr{1,2,3,4,5}; print(arr); ^ | /* Here in main method in the std::arr<int,5> I am explicitly specifying the size of the array but I'll need just like template it should detect size automatically and I don't want to specify the size explicitly */ } 我尝试过: template <typename Container> void print(const Container& container) { std::copy(std::begin(container), std::end(container), std::ostream_iterator<typename Container::value_type> (std::cout," ")) } 而且效果很好,就像这样。我需要模板而不需要像这样在 std::array<int,5> 中明确指定大小。 C++17 引入了类模板参数推导。因此,只需完全删除模板参数即可: std::array arr{1,2,3,4,5};

回答 1 投票 0

如何将整个字节流读取到 std::vector 中?

我在这里阅读了一个答案,展示了如何使用以下一(两个)衬里将整个流读入 std::string : std::istreambuf_iterator eos; std::string s(std::istreambuf_itera...

回答 0 投票 0

unordered_map 中用户定义类型的运算符重载()

我正在看这篇文章 C++ unordered_map 使用自定义类类型作为键 我知道我们需要为自定义类型键重新定义相等性和哈希码。 我知道运营商如何过度...

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.