STL unordered_set设置初始桶数

stl unordered_set how to set initial bucket count

本文关键字:设置 unordered set STL      更新时间:2023-10-16

对于一个unordered_map,我是这样设置初始桶数的:

unordered_map<string, dictionaryWord> dictionary(17749); // set initial bucket count to 17749

这种方法似乎不适用于unordered_set。

/*line 150*/ unsigned char mask;
/*line 151*/ unordered_set<QueryID> query_id(109); // set initial bucket count to 109

编译错误=1)数值常量前的预期标识符。2)期望","或"…"'前面的数字常量。然后写了一堆错误

如何为unordered_set做同样的事情?

谢谢。

=================================================

如果i remove "(109),则没有错误"

"/usr/bin/make" -f nbproject/Makefile-Release.mk QMAKE= SUBPROJECTS= .clean-conf
make[1]: Entering directory `/home/petros/NetBeansProjects/ACM_test'
rm -f -r build/Release
rm -f dist/Release/GNU-Linux-x86/acm_test
make[1]: Leaving directory `/home/petros/NetBeansProjects/ACM_test'

CLEAN SUCCESSFUL (total time: 80ms)
"/usr/bin/make" -f nbproject/Makefile-Release.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/home/petros/NetBeansProjects/ACM_test'
"/usr/bin/make"  -f nbproject/Makefile-Release.mk dist/Release/GNU-Linux-x86/acm_test
make[2]: Entering directory `/home/petros/NetBeansProjects/ACM_test'
mkdir -p build/Release/GNU-Linux-x86/ref_impl
rm -f build/Release/GNU-Linux-x86/ref_impl/core.o.d
g++ -pthread -O3 -std=c++11   -c -O2 -pthread -O3 -std=c++11 -MMD -MP -MF build/Release/GNU-Linux-x86/ref_impl/core.o.d -o build/Release/GNU-Linux-x86/ref_impl/core.o ref_impl/core.cpp
ref_impl/core.cpp:151:37: error: expected identifier before numeric constant
ref_impl/core.cpp:151:37: error: expected ‘,’ or ‘...’ before numeric constant
ref_impl/core.cpp: In function ‘ErrorCode StartQuery(QueryID, const char*, MatchType, unsigned int)’:
ref_impl/core.cpp:250:24: error: expected unqualified-id before ‘(’ token
ref_impl/core.cpp:250:38: error: missing template arguments before ‘)’ token
ref_impl/core.cpp:250:39: error: expected ‘;’ before ‘query_id’
ref_impl/core.cpp:257:19: error: ‘query.SameQueries::query_id’ does not have class type
ref_impl/core.cpp: In function ‘ErrorCode EndQuery(QueryID)’:
ref_impl/core.cpp:265:44: error: ‘queries.std::vector<_Tp, _Alloc>::operator[]<SameQueries, std::allocator<SameQueries> >(((std::vector<SameQueries>::size_type)i)).SameQueries::query_id’ does not have class type
ref_impl/core.cpp:265:58: error: unable to deduce ‘const auto’ from ‘<expression error>’
ref_impl/core.cpp:266:38: error: ‘queries.std::vector<_Tp, _Alloc>::operator[]<SameQueries, std::allocator<SameQueries> >(((std::vector<SameQueries>::size_type)i)).SameQueries::query_id’ does not have class type
ref_impl/core.cpp:267:32: error: ‘queries.std::vector<_Tp, _Alloc>::operator[]<SameQueries, std::allocator<SameQueries> >(((std::vector<SameQueries>::size_type)i)).SameQueries::query_id’ does not have class type
ref_impl/core.cpp:268:36: error: ‘queries.std::vector<_Tp, _Alloc>::operator[]<SameQueries, std::allocator<SameQueries> >(((std::vector<SameQueries>::size_type)i)).SameQueries::query_id’ does not have class type
ref_impl/core.cpp: In function ‘void* TaskCode(void*)’:
ref_impl/core.cpp:463:41: error: ‘quer.SameQueries::query_id’ does not have class type
ref_impl/core.cpp:463:48: error: unable to deduce ‘auto’ from ‘<expression error>’
ref_impl/core.cpp:463:70: error: ‘quer.SameQueries::query_id’ does not have class type
make[2]: *** [build/Release/GNU-Linux-x86/ref_impl/core.o] Error 1
make[2]: Leaving directory `/home/petros/NetBeansProjects/ACM_test'
make[1]: *** [.build-conf] Error 2
make[1]: Leaving directory `/home/petros/NetBeansProjects/ACM_test'
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 1s)

在struct内部。应该是:

unordered_set<QueryID> query_id = unordered_set<QueryID>(109);

谢谢

我怀疑桶数是转移注意力的。看起来QueryID不可见

我怀疑你的QueryID没有标准的构造函数,即QueryID::QueryID() { std::cout << "foo!" };,所以无序集不知道如何用空queryid预填充。

尝试添加一个

或者您可以使用第二个参数来设置每个预构建桶使用的默认数据。

参考:http://en.cppreference.com/w/cpp/container/unordered_set/unordered_set