среда, 30 июня 2010 г.

Каждой твари по паре

Вот значит, понадобилось мне иметь объект, который будет содержать в себе справочник для получения некоторых оценок, которые в свою очередь определяются исходя из попадания в некоторый интервал значений. По сути, должны быть записи типа: значение верхней границы интервала, признак «включительно» и текст комментария, т.е. три поля. Первый (наименьший) элемент справочника оценок имеет значение нижней границы равное нулю. Естественно, значения внутри контейнера должны быть упорядочены. В качестве контейнера выбран std::map, но вот беда ключ-то нужен не простой, сложный. Одно из решений, которое пришло на ум использовать структуру std::pair, с одной стороны в качестве ключа, т.е. пару “верхняя граница интервала – признак включительно”, а с другой значением пары будет комментарий. В общем основное с чем пришлось повозиться это приведение семантики «первый-второй» к семантике «верхняя граница – включая - комментарий». Вот, что получилось:


1 #include <string>
2 #include <map>
3 #include <iostream>
4
5 class Estimation {
6 private:
7 typedef std::pair < int, bool > KeyEstimation ;
8 typedef std::pair <KeyEstimation, std::string > Estim ;
9 Estim estimation_;
10
11 public:
12 Estimation(const int up_border,const bool included,const std::string
» commentary):
» estimation_(std::make_pair(std::make_pair(up_border,included),commentary)) {}
13
14 Estimation() {}
15
16 int borderValue() const {
17 return estimation_.first.first ;
18 }
19 void borderValue(const int value) {
20 estimation_.first.first =value;
21 }
22
23 bool included() const {
24 return estimation_.first.second;
25 }
26 void included(const bool value) {
27 estimation_.first.second=value;
28 }
29
30 std::string commentary() const {
31 return estimation_.second;
32 }
33 void commentary(const std::string& s) {
34 estimation_.second=s;
35 }
36
37 Estim estimation() const {
38 return estimation_;
39 }
40
41 //Скрывая от клиента, что используется std::pair, преобразование придется делать
» явным

42 Estimation(std::map<KeyEstimation, std::string>::const_iterator& es) {
43 estimation_.first.first =es->first.first;
44 estimation_.first.second =es->first.second;
45 estimation_.second =es->second;
46 }
47
48 };
49
50 class ListEstimations {
51 private:
52 typedef std::pair < int, bool > KeyEstimation ;
53 typedef std::pair <KeyEstimation, std::string > Estim ;
54
55 public:
56 ListEstimations() {};
57 ~ListEstimations() {};
58
59 ListEstimations(const Estim& est) {
60 //Вставляет новую запись в список
61 estimations_.insert(est);
62 };//{ estimations_.push_back(est);}
63
64 //Классы исключений
65 class EstimationNotFound { };
66 class DublicateEstimation { };
67
68 ///Всталяет оценку в список и делает проверку на уникальность borderValue_ и
» included_, а вслучае совпадения делает замещение commentary_, не создавая
» нового элемента в контейнере.

69 void insertEstimation(const Estim& est) throw (DublicateEstimation) {
70 //Вставляет новую запись в список
71 estimations_.insert(est);
72 }
73
74 void insertEstimation(const int up_border,const bool included,const
» std::string commentary) {
75
»
»
»
» estimations_.insert(std::make_pair(std::make_pair(up_border,included),commentary));
76 }
77
78 ///Удаляет оценку из списка.
79 void eraseEstimation() throw (EstimationNotFound);
80
81 ///Возвращает оценку по заданным значениям value
82 //const Estimation& getEstimation(int i) const throw (EstimationNotFound);
83 Estimation& getEstimation(int i) throw (EstimationNotFound);
84
85 void print() {
86 for( std::map<KeyEstimation, std::string>::const_iterator
» i=estimations_.begin(); i!=estimations_.end(); ++i) {
87 //std::cout << i->first.first << '\t' << i->first.second << '\t' <<
» i->second << std::endl;//Делает, то же самое, что и следующая строка

88 std::cout << Estimation(i).borderValue() << '\t' <<
» Estimation(i).included() << '\t' << Estimation(i).commentary() << std::endl;
89 }
90 }
91
92 private:
93 ///Запрещение копирования
94 ListEstimations(const ListEstimations&);
95 ListEstimations& operator=(const ListEstimations&);
96
97 std::map<KeyEstimation, std::string> estimations_;
98
99 };
100
101
102 int main() {
103 setlocale(0, "") ;
104
105 Estimation est(10,false,std::string("Комментарий"));
106
107 ListEstimations ests(est.estimation());
108
109 Estimation est2(15,false,std::string("Комментарий2"));
110 ests.insertEstimation(est2.estimation());
111
112 est2.commentary("Комментарий3");
113 est2.borderValue(20);
114 est2.included(false);
115
116 ests.insertEstimation(est2.estimation());
117
118 est2.commentary("Комментарий4");
119 est2.borderValue(20);
120 est2.included(true);
121 ests.insertEstimation(est2.estimation());
122
123 ests.insertEstimation( 120,false,std::string("Комментарий5"));
124
125 ests.print();
126
127 std::cin.get();
128 return 0;
129 }
130

вторник, 15 июня 2010 г.

Какой контейнер STL выбрать?



Блок-схема была создана в приложении Dia под Windows. За основу была взята вот эта картинка C++ STL Containers.

четверг, 3 июня 2010 г.

find_package(wxWidgets)

Решил использовать cmake, сюрпризом было, то что find_package(wxWidgets REQUIRED) не находил библиотеку wxWidgets, все получилось после выполнения следующих команд:

cd %WXWIN%\build\msw
call vcvars32
nmake -f makefile.vc MONOLITHIC=0 SHARED=0 UNICODE=1 BUILD=debug

Таким образом, успешность поиска wxWidgets зависит от наличия debug версии сборки библиотеки ...