不幸的是,我没有完全开发自己开发的程序.我最近注意到运算符上的Visual Studio致命错误 - unordered_set,它是从简单插入指向unordered_set的指针调用的.在查看了本地人之后,我注意到set只有2个元素,其中最后一个是NULL(所以我想这就是它崩溃了).现在问题:unordered_set(或任何其他STL容器)如何(理论上)获得NULL指针作为其元素之一.程序是多线程的,但根据我的评论,这部分代码只能从一个线程访问.谢谢.
为感兴趣的人调用堆栈和部分源代码: http://privatepaste.com/c8e7f35a4e(从Object本身调用PushToProcessed,它将引用传递给自己,因此不能为NULL)
在分布式计算设置中,我想向许多节点发送unordered_set.我知道C++中的序列化,例如使用boost::serialization.我对序列化的看法是,unordered_set在接收到序列化数据后,我面临着在每个节点上重建数据结构的成本.
我的想法是为unordered_set编写一个自定义分配器,它分配一个固定大小的连续内存,并在分配后返回起始内存地址.然后我想获取它的字节表示,unordered_set通过线路发送它,并告诉接收节点这个内存块是一个unordered_set.
那会有用吗?你们有没有其他想法如何解决我的问题?或者你有任何相关的指针,例如写这样的分配器?任何反馈都表示赞赏.
谢谢!
我有一个unordered_set,其中shared_ptrs作为键.这在99%的情况下运行良好,但在同样的情况下我需要从类内搜索集合,我想避免继承enable_shared_from_this,正因为如此.
可以/如何通过原始指针搜索shared_ptr的unordered_set.
QT的对口有序关联容器std::map是QMap,std::set是QSet,无序关联容器std::unordered_map是QHash.
std::unordered_set在Qt中我应该用什么来代替?没有QHash< T, void >专业化,也没有QHash< T >.
有计划的模拟吗?
为什么有a时set.count('a')输出?13
程序:
bool isAnagram(string s, string t) {
unordered_set<char> set;
for(int i=0; i<s.size(); i++){
set.insert(s[i]);
}
cout << endl << set.count('a') << endl;
return false;
}
Run Code Online (Sandbox Code Playgroud)
输入:
s = 'anagram'
Run Code Online (Sandbox Code Playgroud)
输出:
1
Run Code Online (Sandbox Code Playgroud) 我们以 unordered_set 为例。用于确定两个元素是否相等的默认谓词是std::equal_to<T>(t1,t2),它很简单t1==t2。现在让我们假设对于我已经实现的这个 T 类型operator==(),并不是所有的成员变量都是这个比较的一部分,即两个不同的 T 元素 t1,t2 在比较时可以相等。
如果底层哈希表为这些 t1 和 t2 中的每一个计算不同的哈希,它甚至何时执行t1==t2密钥重复检查?如果有更多的检查,它是如何平均保持恒定时间的?
我正在解决一个 DSA 问题,并在 C++ 标准模板库中观察到一个稍微奇怪的行为:
vector<int> v = {1, 7, 8, 3, 12};
unordered_map<int, unordered_set<int>> ump;
for (int i=0; i<v.size(); i++) {
unordered_set<int> us;
us.insert(56);
ump.insert(mp(v[i], us));
}
for (int i=0; i<v.size(); i++) {
unordered_set<int> us = ump.find(v[i])->second;
us.insert(67);
}
for (auto it = ump.begin(); it != ump.end(); it++) {
cout << it->first << ": ";
for (auto ait = it->second.begin(); ait!=it->second.end(); ait++) {
cout << *ait << ' ';
}
cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)
这里的输出是:
vector<int> v = {1, …Run Code Online (Sandbox Code Playgroud) unordered_set<pair<int, int> s;
Run Code Online (Sandbox Code Playgroud)
我想执行s.find()操作,但我不知道如何根据第一个元素来实现它。
eg, if my set is: (3,4),(2,5),(5,6),(7,8)
我想找到第一个元素是 7 的第二个元素,我该怎么做。
我有两个矢量v1和v2类型std::vector<std::string>.两个向量都具有唯一值,如果值比较相等但不依赖于向量中出现的顺序值,则应比较相等.
我假设两组类型std::unordered_set是更好的选择,但我认为它是两个向量.
不过,我想了所需的顺序不区分大小写的比较,我就用operator==从std::unordered_set通过复制两个std::unordered_set.非常喜欢这样:
bool oi_compare1(std::vector<std::string> const&v1,
std::vector<std::string> const&v2)
{
std::unordered_set<std::string> tmp1(v1.begin(),v1.end());
std::unordered_set<std::string> tmp2(v2.begin(),v2.end());
return tmp1 == tmp2;
}
Run Code Online (Sandbox Code Playgroud)
在分析时我注意到这个功能耗费了大量时间,所以我检查了doc并看到了O(n*n)这里的复杂性.我很困惑,我很期待O(n*log(n)),比如我提出的以下天真的解决方案:
bool oi_compare2(std::vector<std::string> const&v1,
std::vector<std::string> const&v2)
{
if(v1.size() != v2.size())
return false;
auto tmp = v2;
size_t const size = tmp.size();
for(size_t i = 0; i < size; ++i)
{
bool flag = false;
for(size_t j = i; j < size; ++j)
if(v1[i] == …Run Code Online (Sandbox Code Playgroud) 我想利用 astd::unordered_set来存储一堆字符串。如果我插入字符串"abc", "def", "bca",结果集将包含什么?
set = { {"abc"}, {"def"}, {"bca"} }
或者
set = { {"abc"}, {"def"} }
??
由于字符串"abc"和"bca"具有相同的字符,即使它们不完全相等。
c++ ×10
unordered-set ×10
stl ×2
algorithm ×1
containers ×1
fatal-error ×1
hash ×1
pointers ×1
qt ×1
string ×1
tr1 ×1