2009-12-28 8 views
4

Так что у меня есть что-то вроде этогоглобальные переменные в C++

#define HASHSIZE 1010081 

static struct nlist *hashtab[HASHSIZE]; 

Теперь я хочу, чтобы иметь возможность изменить HASHSIZE моего HashTab, потому что я хочу, чтобы проверить число различных простых и посмотреть, что дало бы мне меньше столкновений , Но массивы не принимают переменные размеры, поэтому HASHSIZE должен быть постоянным. Есть ли способ сделать это?

+0

Нам нужна дополнительная информация. Вы пытаетесь изменить размер хеш-таблицы на лету? Вы можете использовать 'std :: vector' вместо собственного массива, но вам придется переустанавливать все, что уже есть в таблице во время изменения размера. –

+0

re-bucket ??????????? – SuperString

+1

@SuperString Adrian означает, что если вы измените размер вектора после его выделения, вам придется перепроверить, в каких ведрах находится каждый элемент. Я не думаю, что вы спрашивали об изменении размера существующей хеш-таблицы, хотя, я думаю, вы просто спрашивали о том, как создавать хеш-таблицы разных размеров. –

ответ

10

Почему бы вам не использовать std::vector вместо использования массивов в C++?

Например:

std::vector<nlist *> hashtab; 
    hashtab.resize(<some_value>); 

Но в любом случае вы можете сделать это, если вы используете g++ потому что g++ поддерживает массивы переменной длины (Vlas) как продолжение.

Например:

int HASHSIZE=<some_value> 
    static struct nlist *hashtab[HASHSIZE]; 
0

Почему бы вам просто не использовать константу?

const int HASHSIZE = 1010081; 

Константа доступна компилятором как буквенное значение, поэтому он может быть использован для инициализации массивов (amoung других вещей).

+0

Я буду менять его значение, поэтому const не будет работать? – SuperString

+2

Однако лучше использовать '# define'. –

10

использование std :: vector, описание которого содержится в любой хорошей книге на C++.

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

#include <vector> 

std::vector<nlist*> hash; //empty hash 
hash.resize(1010081); //now it has 1010081 elementns 
1

Вы можете использовать std::vector в соответствии с рекомендациями robson3.14 или выделить массив в куче с new. Если вы решите выделить на кучу обязательно delete []

4

Почему у вас есть глобальная переменная для вашей хеш-таблицы? Вместо этого вам, вероятно, следует создать структуру или класс, который может содержать размер таблицы и указатель на таблицу, и динамически распределять ее память. Следующий размер имеет размер по умолчанию, но при создании хеш-таблицы вы можете перейти в другом размере, чтобы попробовать разные размеры.

class HashTable { 
public: 
    HashTable(int size = 1010081) : m_size(size) { 
    m_table = new nlist *[m_size]; 
    } 
    ~HashTable() { 
    delete[] m_table; 
    } 

    // Define getters, setters, etc. here... 

private: 
    int m_size; 
    struct nlist **m_table; 
}; 

примечание: Я предполагаю (основано на том, что вы пытаетесь реализовать свой собственный хэш-таблицу, и некоторые из ваших предыдущих вопросов), что вы заинтересованы в получении информации о низком уровне реализация хэш-таблицы, и поэтому я даю вам довольно низкий уровень ответа о том, как распределять и освобождать память самостоятельно. В реальной программе, используя std::vector, как описано в нескольких других ответах, вероятно, будет правильным решением, так как это уменьшит объем бухгалтерского учета, который вам нужно сделать самостоятельно. Опять же, в реальной программе вы, вероятно, не захотите реализовать свою собственную хеш-таблицу, но вместо этого используйте существующую таблицу, например hash_map (не стандартную, но широко доступную), boost::unordered_map, или std::tr1::unordered_map (это находится на трек станет стандартом и основан на boost::unordered_map).

0

В C99 добавлены массивы переменной длины. Однако C99 не включен в стандарт C++. GCC 4.2.2 позволяет использовать массивы переменной длины в C++ (here)

Сказав, что выделение массива в куче с использованием либо std :: vector, либо нового оператора всегда предпочтительнее для больших распределений памяти, поскольку пространство стека может быть ограниченный и перекрывающий стек, является безвозвратной ошибкой. Выделение кучи всегда можно проверить.