我知道我可以测试set1是否是set2的子集:
{'a','b','c'} <= {'a','b','c','d','e'} # True
Run Code Online (Sandbox Code Playgroud)
但以下也是正确的:
{'a','a','b','c'} <= {'a','b','c','d','e'} # True
Run Code Online (Sandbox Code Playgroud)
我如何考虑集合中元素的出现次数,以便:
{'a','b','c'} <= {'a','b','c','d','e'} # True
{'a','a','b','c'} <= {'a','b','c','d','e'} # False since 'a' is in set1 twice but set2 only once
{'a','a','b','c'} <= {'a','a','b','c','d','e'} # True because both sets have two 'a' elements
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做:
A, B, C = ['a','a','b','c'], ['a','b','c','d','e'], ['a','a','b','c','d','e']
all([A.count(i) == B.count(i) for i in A]) # False
all([A.count(i) == C.count(i) for i in A]) # True
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有一些更简洁的东西set(A).issubset(B,count=True)或一种方法来保持列表理解.谢谢!
起初我是新来的,英语不是我的母语,所以对任何语法上的失败道歉,但我发现这个社区真的很好,所以我会尽可能准确地问我的问题.
我想将自己的类对象添加到stl容器multiset中,并希望使用我自己在类中定义的重载less运算符对其进行排序.我真的尝试了几种解决方案,但没有真正有效,所以我希望有人可以给我一些有用的提示来解决它.
这是我对类定义的总体看法:
class object {
public:
int first;
string second;
object(int f, string s) {
first = f;
second = s;
}
bool operator<(const object &comp) {
return first < comp.first;
}
};
Run Code Online (Sandbox Code Playgroud)
这是我的第一次尝试,它没有用,所以我也尝试将重载的运算符声明为朋友方法,但它也不起作用.
这是我的主要功能的简短代码摘录:
includes ...
//code omitted
int main() {
multiset<object*> mmset;
mmset.insert(new object(10, "test"));
mmset.insert(new object(11, "test"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
过了一会儿,我开始调试我的代码,并试图找出问题所在,我遇到了以下让我有点怀疑的事情.
来自stl的代码提取:
// TEMPLATE STRUCT less
template<class _Ty>
struct less : public binary_function<_Ty, _Ty, bool>
{ // functor for operator<
bool operator()(const _Ty& _Left, const _Ty& …Run Code Online (Sandbox Code Playgroud) 我不知道是什么让这段代码出错.这是一个简单的multiset.没有编译错误,但在执行时机器上出现分段错误.
g ++版本:4.8.2
机器:Ubuntu 14.04
#include <cstdio>
#include <set>
using namespace std;
struct compare
{
bool operator() (int lhs, int rhs) { return lhs < rhs; }
};
typedef multiset < int, compare > mi;
mi sett;
int main(void)
{
sett.insert(5);
sett.insert(5);
sett.erase(*sett.begin());
sett.erase(*sett.rbegin());
printf("Done\n");
}
Run Code Online (Sandbox Code Playgroud) 我试图通过使用以下方法找出多集中有多少元素小于某个 X:
mset.lower_bound(X) - mset.begin()
Run Code Online (Sandbox Code Playgroud)
但它没有用。任何解决方法?
为什么我们应该使用"多组"(因为我们知道"多组"可以保持重复键)
为什么我们不应该使用向量?
我们在向量中没有"多组"中有什么好的功能吗?(或其他容器,如矢量)
你知道"多套装"的特殊用法吗?
我在guava中有一个multiset,我想检索一个给定元素的实例数而不迭代这个multiset(我不想迭代因为我认为迭代需要相当长的时间,因为它查看了所有的集合).
为此,我首先考虑使用multiset的entryset()方法来获取具有单个实例及其相应计数的集合.然后,将此集转换为hashmap(其中keys是我的set的元素,值是它们的实例计数).因为那时我可以使用hashmap的方法直接从其键中检索一个值 - 完成!但这只有在我能够快速地将集合转换为散列图(没有迭代所有元素)时才有意义:是否可能?
(正如我所说的,我希望这个问题在多个方面存在缺陷,如果你能说明我在这里可能犯的概念错误,我会很高兴.谢谢!)
如何从多集结构中获取前N个元素,而不是不断获取第一个(.begin())元素然后擦除它?
我只是想在不影响multiset的情况下对前N个元素求和.
我想在多集中插入一个整数值和一对.
所以我宣布它为:
multiset < int, pair < int, int> > mp;
int m,n,p;
Run Code Online (Sandbox Code Playgroud)
要在multiset中插入,我试过这个:
mp.insert(make_pair(m, make_pair(n,p))); // Compile time error
Run Code Online (Sandbox Code Playgroud)
但它给出编译时错误......有人可以建议正确的方法来实现它.
如标题所述,multiset在所有相同值的范围的末尾插入一个值。
(例如:在一个多重插入2 1,2,2,3使得它1,2,2,/*new*/ 2,3)。
如何获得在所有相同值范围的开头插入的新值?
(例如:在多集中插入2 1,2,2,3应该使1,/*new*/ 2,2,2,3)