Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > STL<map> и VC6+


Автор: bel_nikita 7.11.2003, 09:53
Что-то не пойму как создать ассоциативный список с фиксированным к-вом элементов.
Т.е. динамическое выделение мне не подходит. Количество элементов в списке должно быть фиксированное.

И еще, возможно ли избавиться от назойливого warning'а за номером 4786, кроме как #pragma warning(disable : 4786)


Автор: SeregaLBN 7.11.2003, 11:37
Заверни map в свой класс, в конструкторе которого устанавливай необходимый размер.

От warning'a избавиться точно можно, я это видел, вроде бы, у Страуструпа.... Как точно - непомню. Найду, дам знать...

Автор: SeregaLBN 7.11.2003, 11:54
Нашёл.
Страуструп. Третье издание. Приложение Б (Совместимость) - Б.3.5. Шаблоны.

Автор: bel_nikita 7.11.2003, 13:23
Цитата
Заверни map в свой класс, в конструкторе которого устанавливай необходимый размер.

map pавернут в класс, но как установить размер?
не мог бы привести пример.
я не совсем "дохожу" как вызвать конструктор, точнее как вообще создается список.
Я с STL еще ни разу не пробывал работать. А тут как раз подходящий случай мне подвернулся: надо создать ассоциативный список <ключ, значение>.

спасибо за warnin.

Автор: SeregaLBN 7.11.2003, 14:25
Держи

//#define UNICODE
#ifdef UNICODE
#pragma comment(linker, "/ENTRY:wWinMainCRTStartup")
#define _UNICODE
#else
#pragma comment(linker, "/ENTRY:WinMainCRTStartup")
#endif // UNICODE

#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
#pragma warning(disable:4786)
#include <map>
#include <vector>

typedef int KEY;
typedef TCHAR VALUE;

typedef std::map<KEY, VALUE> MAP_KeyValue;

typedef std::vector<KEY > VECTOR_Key;
typedef std::vector<VALUE> VECTOR_Value;

class CEnvelopeMap {
private:
mutable MAP_KeyValue map;
public:
CEnvelopeMap(const VECTOR_Key &key, const VECTOR_Value& value) {
size_t size = key.size();
if (size != value.size()){
// error
return;
}
for (int i=0; i<size; i++) {
map[key[i]] = value[i];
}
}
// Здесь добавляй прочие методы не меняющие размер map.
// Типа следующих:
size_t GetSize() const {return map.size();}
VALUE& operator[](const KEY &key) {return map[key];}
const VALUE operator[](const KEY &key) const {return map[key];}
};

int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpszCmdLine, int nCmdShow )
{
const size_t max = 5;

VECTOR_Key key;
VECTOR_Value val;

key.resize(max);
val.resize(max);

// заполняеш своими значениями
for (int i=0; i<max; i++) {
key[i] = i;
val[i] = TEXT('0') + i;
}

// создание map
CEnvelopeMap Map(key, val);


{ // выборка
Map[0];

VALUE& val1 = Map[1]; // выборка на чтение/запись
val1 = TEXT('X'); // можешь менять - меняется и в Map

VALUE val2 = Map[2]; // выборка на чтение/запись
val2 = TEXT('Y'); // можешь менять - но в Map значение _НЕ_ меняется

const VALUE val3 = Map[3]; // выборка только на чтение
//val2 = TEXT('Z'); // ERROR - нельзя менять
}

return 0;
}

Автор: bel_nikita 7.11.2003, 14:33
SeregaLBN
спасибо!
ща буду эксперенменты ставитьsmile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)