fork download
  1. /*
  2. 1. Sa se defineasca o clasa "Radio" avand urmatoarea data membra privata: radioName (std::string).
  3. Observatie: Clasa nu va dispune de metode de tip getter si setter pentru "radioName".
  4. 2. Sa se utilizeze un container STL asociativ in care sa se stocheze urmatoarele asocieri:
  5. AEHC -> operational,
  6. AEQE -> neoperational,
  7. AEQK -> operational,
  8. AEQK -> operational,
  9. AEQP -> neoperational
  10.  
  11. Observatie: Cheia va fi de tipul "Radio", valoarea de tip "bool" - reprezentand flag-ul care indica operabilitatea radio-ului respectiv (true -> operational, false -> neoperational). Se vor admite elemente cu chei identice.
  12. 3. Sa se stearga din container-ul definit la pct. 2 toate radio-urile neoperabile.
  13. 4. Sa se extraga intr-un std::vector<std::string> toate numele de radio-uri, astfel incat sa nu existe duplicate. Se vor folosi functii STL si dupa caz, se va utiliza si un functor.
  14.  
  15. Observatie: Pentru rezolvarea exercitiilor se vor folosi functii STL, exceptand std::for_each.
  16. */
  17.  
  18. #include <algorithm>
  19. #include <functional>
  20. #include <iostream>
  21. #include <map>
  22. #include <string>
  23. #include <type_traits>
  24. #include <vector>
  25.  
  26. namespace consts
  27. {
  28.  
  29. constexpr const char* AEHC = "AEHC";
  30. constexpr const char* AEQE = "AEQE";
  31. constexpr const char* AEQK = "AEQK";
  32. constexpr const char* AEQP = "AEQP";
  33.  
  34. } // namespace consts
  35.  
  36. namespace radio
  37. {
  38.  
  39. class Radio final
  40. {
  41. public:
  42. explicit Radio(const std::string& radioName)
  43. : radioName_{ radioName }
  44. {}
  45.  
  46. enum class EOperationalState
  47. {
  48. EOperationalState_Disabled,
  49. EOperationalState_Enabled
  50. };
  51.  
  52. private:
  53. friend class RadioName;
  54. friend bool operator<(const Radio& lhs, const Radio& rhs) noexcept;
  55. friend std::ostream& operator<<(std::ostream& out, const Radio& radio) noexcept;
  56.  
  57. std::string radioName_;
  58. };
  59.  
  60. class RadioName final
  61. {
  62. public:
  63. std::string operator()(const std::pair<Radio, bool>& p) const noexcept
  64. {
  65. return p.first.radioName_;
  66. }
  67. };
  68.  
  69. bool operator<(const Radio& lhs, const Radio& rhs) noexcept
  70. {
  71. return std::less<decltype(lhs.radioName_)>()(lhs.radioName_, rhs.radioName_);
  72. }
  73.  
  74. std::ostream& operator<<(std::ostream& out, const Radio& radio) noexcept
  75. {
  76. out << radio.radioName_;
  77.  
  78. return out;
  79. }
  80.  
  81. template <class Key, class T>
  82. void printMap(const std::multimap<Key, T>& m) noexcept
  83. {
  84. for (const auto& p: m)
  85. {
  86. std::cout << p.first << " -> " << p.second << std::endl;
  87. }
  88. }
  89.  
  90. template <class T>
  91. void printVec(const std::vector<T>& v) noexcept
  92. {
  93. for (const auto& e : v)
  94. {
  95. std::cout << e << std::endl;
  96. }
  97. }
  98.  
  99. void eraseDisabledRadios(std::multimap<Radio, bool>& m) noexcept
  100. {
  101. for(auto it{ m.cbegin() }; it!= m.cend();)
  102. {
  103. if (!it->second)
  104. {
  105. it = m.erase(it);
  106. }
  107. else
  108. {
  109. ++it;
  110. }
  111. }
  112. }
  113.  
  114. void fillWithUniqueRadioNames(
  115. const std::multimap<Radio, bool>& m,
  116. std::vector<std::string>& v) noexcept
  117. {
  118. std::transform(m.cbegin(), m.cend(), std::back_inserter(v), RadioName());
  119.  
  120. const auto it{ std::unique(v.begin(), v.end()) };
  121. v.erase(it, v.end());
  122. }
  123.  
  124. } // namespace radio
  125.  
  126. int main()
  127. {
  128. std::multimap<radio::Radio, bool> m{
  129. {
  130. radio::Radio{ consts::AEHC },
  131. static_cast<std::underlying_type_t<radio::Radio::EOperationalState>>(radio::Radio::EOperationalState::EOperationalState_Enabled)
  132. },
  133. {
  134. radio::Radio{ consts::AEQE },
  135. static_cast<std::underlying_type_t<radio::Radio::EOperationalState>>(radio::Radio::EOperationalState::EOperationalState_Disabled)
  136. },
  137. {
  138. radio::Radio{ consts::AEQK },
  139. static_cast<std::underlying_type_t<radio::Radio::EOperationalState>>(radio::Radio::EOperationalState::EOperationalState_Enabled)
  140. },
  141. {
  142. radio::Radio{ consts::AEQK },
  143. static_cast<std::underlying_type_t<radio::Radio::EOperationalState>>(radio::Radio::EOperationalState::EOperationalState_Enabled)
  144. },
  145. {
  146. radio::Radio{ consts::AEQP },
  147. static_cast<std::underlying_type_t<radio::Radio::EOperationalState>>(radio::Radio::EOperationalState::EOperationalState_Disabled)
  148. }
  149. };
  150.  
  151. std::cout << std::boolalpha << "2. All radios:" << std::endl;
  152. radio::printMap(m);
  153. std::cout << std::endl;
  154.  
  155. radio::eraseDisabledRadios(m);
  156.  
  157. std::cout << "3. All enabled radios:" << std::endl;
  158. radio::printMap(m);
  159. std::cout << std::endl;
  160.  
  161. std::vector<std::string> operationalRadios;
  162. radio::fillWithUniqueRadioNames(m, operationalRadios);
  163.  
  164. std::cout << "4. Nr. of unique enabled radios: " << operationalRadios.size() << std::endl;
  165. radio::printVec(operationalRadios);
  166. std::cout << std::endl;
  167.  
  168. return 0;
  169. }
  170.  
Success #stdin #stdout 0.01s 5276KB
stdin
Standard input is empty
stdout
2. All radios:
AEHC -> true
AEQE -> false
AEQK -> true
AEQK -> true
AEQP -> false

3. All enabled radios:
AEHC -> true
AEQK -> true
AEQK -> true

4. Nr. of unique enabled radios: 2
AEHC
AEQK