stl unordered_set как установить начальное количество сегментов

Для 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?

Спасибо.

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

Нет ошибок, если я удалю "(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)

person pdrak    schedule 06.04.2013    source источник
comment
Должно сработать: explicit unordered_set( size_type bucket_count = /*implementation-defined*/, const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(), const Allocator& alloc = Allocator() );   -  person chris    schedule 06.04.2013
comment
мы можем увидеть эту кучу ошибок?   -  person scones    schedule 06.04.2013
comment
@scones Ты недостоин!   -  person Joseph Mansfield    schedule 06.04.2013
comment
блин, но я очень стараюсь! :/   -  person scones    schedule 06.04.2013
comment
@chris, а как мне установить название набора? (WID) и что он держит (WID)?   -  person pdrak    schedule 06.04.2013
comment
@PetrosDrakoulis Мне кажется, все в порядке. Как и спросил Сконс, можете ли вы показать нам фактические ошибки? Все они.   -  person Joseph Mansfield    schedule 06.04.2013
comment
Вы определили специализацию std::hash для WID?   -  person Andy Prowl    schedule 06.04.2013
comment
Да, попробуйте со встроенным типом, а затем перейдите к WID.   -  person chris    schedule 06.04.2013
comment
Вы #include <unordered_set>?   -  person Andy Prowl    schedule 06.04.2013
comment
Я просто добавил вывод компилятора. wid было упрощением. Теперь у вас есть исходная линия. Программа работает нормально. Теперь я хочу установить некоторые начальные счетчики корзин во всех unordered_maps и unordered_sets, чтобы избежать роста корзины во время выполнения.   -  person pdrak    schedule 06.04.2013
comment
Я считаю, что вам, возможно, придется показать реальный код. Вероятно, какой-то заголовок вы не импортируете, например. тот, который содержит определение вашего типа QueryID   -  person Andy Prowl    schedule 06.04.2013
comment
Он должен знать тип QueryID, потому что если я удалю (109), он сработает. И он использует этот тип ранее в файле, так что...   -  person pdrak    schedule 06.04.2013


Ответы (3)


Это было внутри структуры. Это должно было быть:

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

Спасибо

person pdrak    schedule 14.04.2013

Я подозреваю, что подсчет ведра - отвлекающий маневр. Похоже, QueryID не видно.

person NPE    schedule 06.04.2013
comment
Если это так, почему он работает нормально, если я удалю (109). Он знает тип QueryID - person pdrak; 06.04.2013
comment
@PetrosDrakoulis: Если это работает, когда вы удаляете 109 и не вносите никаких других изменений, я снимаю свое предложение. - person NPE; 06.04.2013
comment
@PetrosDrakoulis: Если вы включите SSCCE (sscce.org), это поможет другим людям помочь вам. Иначе слишком много неизвестных. - person NPE; 06.04.2013

Я подозреваю, что ваш QueryID не имеет стандартного конструктора, то есть QueryID::QueryID() { std::cout << "foo!" };, поэтому неупорядоченный набор не знает, как предварительно заполнить пустые идентификаторы QueryID.

Попробуйте добавить один.

Или вы можете использовать второй параметр, чтобы установить данные по умолчанию, которые будут использоваться для каждого предварительно созданного сегмента.

Ссылка: http://en.cppreference.com/w/cpp/container/unordered_set/unordered_set

person scones    schedule 06.04.2013