stl 相关问题

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

向量迭代器不兼容

我有一个带有 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

std::vector 的函数push_back 中出现奇怪的段错误

当我将 _Tp 类型的对象推回 std::vector 时,会出现段错误信号 SIGSEGV,模板 new_allocator<_Tp> 在以下代码片段末尾返回: 指针 分配(

回答 2 投票 0

如何使用 std::views C++20 功能对向量进行排序?

我想以排序的方式循环遍历向量而不修改底层向量。 std::views 和/或 std::range 可以用于此目的吗? 我已经使用 vie 成功实现了过滤...

回答 2 投票 0

高效地以随机顺序填充大表

给定一个 2D 表,例如 结构体POD { int 一些数据; 浮动一些其他数据; 布尔一些更多数据; // 其他基本数值类型... }; 我如何有效地填充...

回答 1 投票 0

Multimap 不接受玩家输入的名字

我目前正在尝试使用多地图实现排行榜,让玩家输入他们的名字。 当我给它一个普通字符串但由于某种原因不接受播放器输入时它起作用......

回答 1 投票 0

C++11 STL 容器和线程安全

我无法找到任何有关此的最新信息。 C++11 版本的 STL 容器是否有一定程度的线程安全保证? 由于性能原因,我确实希望他们不会......

回答 3 投票 0

STL 删除无法按预期工作?

int main() { 常量 int 大小 = 10; int a[大小] = {10, 2, 35, 5, 10, 26, 67, 2, 5, 10}; std::ostream_iterator< int > 输出(cout,“”); std::向量< int >...

回答 5 投票 0

在 C++ STL 中是否必须有一个模板函数来将向量作为参数传递?

是否必须有一个函数作为模板来传递向量作为参数,如下面的代码所示? 另外,在争论中为什么我们需要传递 std::vector ? (我正在学习的基本问题...

回答 2 投票 0

StackOverflow 喜欢将你的辛勤工作卖给 OpenAI

我想删除这个问题,但是SO不允许我这样做,所以我会编辑它。 现在 StackOverflow 与 OpenAI 合作,我希望我们都能为我们作为下属所做的辛勤工作感到自豪......

回答 1 投票 0

如何输入自定义类的向量?

我定义了类 T,并使用默认构造函数、复制构造函数和重载的赋值运算符来实现 我尝试过执行以下操作 #包括 //

回答 2 投票 0

STL容器类:数组

我只是在探索 C++ 中的 STL 容器。有一些问题... 有两个成员函数max_size()和size()。他们似乎在做同样的事情。我最初认为 max_size() 是

回答 3 投票 0

std::map/std::set 和 equal_range,这里的推理是什么?

我刚刚注意到 std::map 和 std::set 的成员函数 equal_range 返回某个键的迭代器值范围。当地图和集合总是有序时,这有什么意义......

回答 1 投票 0

为什么C++分配器使用reinterpret_cast以及如何避免它?

我试图实现自己的小型分配器用于测试目的,在设计它时我认为我不知道如何在不违反严格别名规则的情况下实现它。 在大多数[开放所以...

回答 1 投票 0

C++11 unordered_set 与 std::owner_less 类似散列

我正在使用外部网络库,它返回一些代表打开的套接字的神奇结构,并且文档说,当将它们插入到 STL 容器中时,应该使用 std::

回答 3 投票 0

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