ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° C/C++ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° | cpp, boost, qt
ΠΡΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Π΄Π»Ρ ΠΏΠ»ΡΡΠΎΠ²ΠΈΠΊΠ° ΠΈ ΡΠΈΡΠ½ΠΈΠΊΠ° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ°Π½Π°Π»Π΅. ΠΠ°ΠΊ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΈΠΈ-Π°Π³Π΅Π½ΡΠ°: https://clc.to/tvpmDQ ΠΠΎ ΡΠ΅ΠΊΠ»Π°ΠΌΠ΅: @tproger_sales_bot ΠΠ±ΡΠ°ΡΠ½Π°Ρ ΡΠ²ΡΠ·Ρ: @proglibrary_feeedback_bot Π ΠΠ: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17 #WXSSA
Show moreπ Analytical overview of Telegram channel ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° C/C++ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° | cpp, boost, qt
Channel ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° C/C++ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° | cpp, boost, qt (@cppproglib) in the Russian language segment is an active participant. Currently, the community unites 16 813 subscribers, ranking 7 717 in the Technologies & Applications category and 39 129 in the Russia region.
π Audience metrics and dynamics
Since its creation on Π½Π΅Π²ΡΠ΄ΠΎΠΌΠΎ, the project has demonstrated rapid growth, gathering an audience of 16 813 subscribers.
According to the latest data from 26 October, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -53 over the last 30 days and by -12 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 10.76%. Within the first 24 hours after publication, content typically collects 4.45% reactions from the total number of subscribers.
- Post reach: On average, each post receives 1 810 views. Within the first day, a publication typically gains 748 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 2.
- Thematic interests: Content is focused on key topics such as c++, Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ, ΡΠ΄Π°Π»ΡΠ½ΠΊΠ°, developer.
π Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
βΠΡΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Π΄Π»Ρ ΠΏΠ»ΡΡΠΎΠ²ΠΈΠΊΠ° ΠΈ ΡΠΈΡΠ½ΠΈΠΊΠ° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ°Π½Π°Π»Π΅.
ΠΠ°ΠΊ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΈΠΈ-Π°Π³Π΅Π½ΡΠ°: https://clc.to/tvpmDQ
ΠΠΎ ΡΠ΅ΠΊΠ»Π°ΠΌΠ΅: @tproger_sales_bot
ΠΠ±ΡΠ°ΡΠ½Π°Ρ ΡΠ²ΡΠ·Ρ: @proglibrary_feeedback_bot
Π ΠΠ: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
#W...β
Thanks to the high frequency of updates (latest data received on 27 October, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
new ΠΈ delete Π² constexpr-ΡΡΠ½ΠΊΡΠΈΡΡ
. ΠΠ²ΡΡΠΈΡ Π΄ΠΈΠΊΠΎ β ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π°Π»Π»ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ°ΠΌΡΡΡ, Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΅ΡΡ Π½Π΅ Π·Π°ΠΏΡΡΠ΅Π½Π°?
constexpr int sum() {
int* p = new int(42);
int result = *p;
delete p;
return result;
}
constexpr int x = sum(); // OK Π² C++20
β‘οΈ ΠΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ: ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΡΠ΅Ρ ΠΊΡΡΡ ΠΊΠ°ΠΊ ΡΠ°ΡΡΡ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ. new ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°, delete ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄ΡΠ½Π½ΡΠΉ. ΠΠΈΠΊΠ°ΠΊΠΎΠΉ ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΈ Π½Π΅ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ.
βοΈ ΠΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ β transient allocation: Π²ΡΡ ΠΏΠ°ΠΌΡΡΡ, Π²ΡΠ΄Π΅Π»Π΅Π½Π½Π°Ρ Π² constexpr-ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅, Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½Π° Π΄ΠΎ Π²ΡΡ
ΠΎΠ΄Π° ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°. ΠΠ΅Π»ΡΠ·Ρ Β«ΠΏΡΠΎΠ½Π΅ΡΡΠΈΒ» ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π² runtime:
constexpr int* leak() {
return new int(42); // ΠΡΠΈΠ±ΠΊΠ°: non-transient allocation
}
βοΈ ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ constexpr std::vector ΡΠ°Π±ΠΎΡΠ°Π΅Ρ: Π²Π΅ΠΊΡΠΎΡ Π°Π»Π»ΠΎΡΠΈΡΡΠ΅Ρ Π² compile-time, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΠΈ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ. ΠΠΎ Π½Π΅Π»ΡΠ·Ρ ΡΠΎΠ·Π΄Π°ΡΡ constexpr std::vector ΠΊΠ°ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ β Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ Π²ΡΠ·ΠΎΠ²Π΅ΡΡΡ, Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΆΠΈΠ²ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ.
π‘ Transient allocation β ΡΡΠΎ ΠΏΠ΅ΡΠΎΡΠ½ΠΈΡΠ°: ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΡΡ, Π½ΠΎ Π½Π΅ Π²ΡΠΏΡΡΠΊΠ°Π΅Ρ Π΅Ρ Π½Π°ΡΡΠΆΡ.
πΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° C/C++ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
#ΠΏΠΎΠ΄_ΠΊΠ°ΠΏΠΎΡΠΎΠΌΠ ΡΠΊΠΎΠ²ΠΎΠ΄ΠΈΠ» ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ML-ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² ΡΠΈΠ½ΡΠ΅Ρ Π΅ Ρ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΡΡΠ΅ΠΊΡΠΎΠΌ Π±ΠΎΠ»Π΅Π΅ 100 ΠΌΠ»Π½ β½π£ ΠΠ°ΠΏΡΡΠΊ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ² Π½Π° 6.000+ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
ΠΠ½ΡΠΎΠ½ ΡΡΡΠΎΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΡΡΡΡΠΈ Π»ΡΠ΄Π΅ΠΉ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΎΠ΄Π΅.π£ Π£ΡΠΊΠΎΡΡΠ΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ
ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π» ML-ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ ΠΈ ΠΊΡΠ°ΡΠ½ΠΎ ΡΠΎΠΊΡΠ°ΡΠΈΠ» Π²ΡΠ΅ΠΌΡ ΠΎΡ Π½Π°ΡΠ°Π»Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄ΠΎ ΡΠ΅Π»ΠΈΠ·Π°π ΠΠ΄Π΅ ΠΠ½ΡΠΎΠ½ ΡΠ΅ΡΠΏΠ°Π΅Ρ Π·Π½Π°Π½ΠΈΡ (ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ ΡΠΊΡΠΏΠ΅ΡΡΠ°): - X (Twitter) β Π³Π»Π°Π²Π½ΡΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ Π±Π»ΠΎΠ³ ΠΠΎΡΠΈΡΠ° Π§Π΅ΡΠ½ΠΈ (ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ Claude Code) β ΡΠ°ΠΌ Π±Π°Π·Π° ΠΏΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΠ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅. - ΠΠ΅ΡΠ²ΠΎΡΠΊΠΈΠ½Π³ Π² Π’Π: ΡΠ°ΡΡ LLM ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ ΠΈ AI-ΡΠ°Ρ β Π·Π΄Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΎΡΠ²Π΅Ρ ΠΏΠΎΡΡΠΈ Π½Π° Π»ΡΠ±ΠΎΠΉ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΠΎΠΏΡΠΎΡ. - ΠΠΎΠ²ΠΎΡΡΠΈ AI: ΠΊΠ°Π½Π°Π»Ρ Π‘ΠΈΠΎΠ»ΠΎΡΠ½Π°Ρ ΠΈ Denis Sexy IT. ΠΠ° ΠΊΡΡΡΠ΅ Agentops ΠΠ½ΡΠΎΠ½ ΡΡΠΈΡ ΡΡΡΠΎΠΈΡΡ Β«Π½Π΅ΡΠ±ΠΈΠ²Π°Π΅ΠΌΡΠΉΒ» Π±ΡΠΊΠ΅Π½Π΄: ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ, ΡΠ°ΠΉΠΌΠ°ΡΡΠ°ΠΌΠΈ ΠΈ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΠΊΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ, ΡΡΠΎΠ±Ρ Π²Π°ΡΠΈ Π°Π³Π΅Π½ΡΡ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎ 24/7. π ΠΠ°ΠΉΡΠΊΠΈΠ΅ Π‘ΠΠΠΠΠ Π² Proglib Academy! ΠΠΎ ΠΊΠΎΠ½ΡΠ° ΠΌΠ°Ρ Π½Π° Π²ΡΠ΅ ΠΊΡΡΡΡ Π°ΠΊΠ°Π΄Π΅ΠΌΠΈΠΈ (Π²ΠΊΠ»ΡΡΠ°Ρ AgentOps ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΠΠ-Π°Π³Π΅Π½ΡΠΎΠ²) Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ ΡΠΊΠΈΠ΄ΠΊΠ° -40%. ΠΡΠΎ Π»ΡΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, ΡΡΠΎΠ±Ρ Π²ΠΎΠΉΡΠΈ Π² AI-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΠΏΠΎΠ΄ ΠΏΡΠΈΡΠΌΠΎΡΡΠΎΠΌ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠ². Π£Π·Π½Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠΈ Ρ ΠΠ½ΡΠΎΠ½Π°: π ΠΡΡΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ Π²Π½Π΅Π΄ΡΡΡΡ AI-Π»ΠΎΠ³ΠΈΠΊΡ Π² Π±ΡΠΊΠ΅Π½Π΄ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡ ΡΠ΅ΡΠ²ΠΈΡΠ° ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π·Π½Π°ΠΊΠΎΠΌΠΈΡΡ Π²Π°Ρ Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ? π β ΠΠ°, ΠΆΠ΄Π΅ΠΌ Π½ΠΎΠ²ΡΡ Π»ΠΈΡ π₯ β ΠΠΎΠΉΠ΄Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΡΡΡ Π½Π° ΠΊΠ°Π½Π°Π»Ρ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΠ½ΡΠΎΠ½Π° πββοΈ Proglib Academy
std::ranges::* β ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΈΠ· <algorithm>. ΠΠ½ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ (Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ begin/end) ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠΈΠΈ.
π ranges::find / ranges::find_if β Π½Π°ΠΉΡΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ
std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6};
// ΠΠ°ΠΉΡΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΡΠ°Π²Π½ΡΠΉ 4
auto it = std::ranges::find(v, 4);
if (it != v.end()) {
std::cout << "ΠΠ°ΠΉΠ΄Π΅Π½ΠΎ: " << *it << "\n"; // 4
}
// ΠΠ°ΠΉΡΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠΈΠΉ ΡΡΠ»ΠΎΠ²ΠΈΡ
auto it2 = std::ranges::find_if(v, [](int x) { return x > 5; });
// ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° 9
βοΈ ΠΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ Π½Π° Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ»ΠΈ end(), Π΅ΡΠ»ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ std::find, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ β Π½ΠΈΠΊΠ°ΠΊΠΈΡ
v.begin(), v.end().
βοΈ ranges::all_of / any_of / none_of β ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° Π²Π΅ΡΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½
std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6};
bool all_positive = std::ranges::all_of(v, [](int x) { return x > 0; });
// true β Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠ΅
bool any_gt_8 = std::ranges::any_of(v, [](int x) { return x > 8; });
// true β Π΅ΡΡΡ 9
bool none_neg = std::ranges::none_of(v, [](int x) { return x < 0; });
// true β ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΡ
Π½Π΅Ρ
Π’ΡΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°, ΠΎΠ΄Π½Π° ΠΈΠ΄Π΅Ρ: ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ Π½Π° Π²ΡΡΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅. ΠΠ΅Π½ΠΈΠ²ΡΠ΅ β all_of ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ false, any_of β Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ true.
π§ ranges::count / ranges::count_if β ΠΏΠΎΠ΄ΡΡΡΡ
auto count_ones = std::ranges::count(v, 1); // 2
auto count_big = std::ranges::count_if(v, [](int x) { return x > 5; }); // 2 (9, 6)
count β ΡΠΎΡΠ½ΠΎΠ΅ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅, count_if β ΠΏΠΎ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ. ΠΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ std::ranges::range_difference_t, Π° Π½Π΅ int β Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎ ptrdiff_t.
πͺ ranges::minmax_element β ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡ
ΠΎΠ΄
auto [min_it, max_it] = std::ranges::minmax_element(v);
std::cout << *min_it << " " << *max_it; // 1 9
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠ°ΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ² {min, max}. ΠΠ΄ΠΈΠ½ ΠΏΡΠΎΡ
ΠΎΠ΄ Π²ΠΌΠ΅ΡΡΠΎ Π΄Π²ΡΡ
ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ
Π²ΡΠ·ΠΎΠ²ΠΎΠ² min_element + max_element. Structured bindings (auto [min_it, max_it]) Π΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ΄ ΡΠΈΡΠ΅.
βοΈ Π’Π°ΠΊΠΆΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ ranges::min_element ΠΈ ranges::max_element ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΡΡΠΈ. Π ranges::min / ranges::max Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΊΠΎΠΏΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ (Π½Π΅ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ ΠΈ Π½Π΅ ΡΡΡΠ»ΠΊΡ) β ΡΡΠΈΡΡΠ²Π°ΠΉΡΠ΅ ΡΡΠΎ Π΄Π»Ρ ΡΡΠΆΡΠ»ΡΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
π ΠΡΠΎΠ΅ΠΊΡΠΈΠΈ β ΡΡΠΏΠ΅ΡΡΠΈΠ»Π° ranges-Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ²
struct Person {
std::string name;
int age;
};
std::vector<Person> people = {{"ΠΠ»ΠΈΡΠ°", 30}, {"ΠΠΎΡΠΈΡ", 25}, {"ΠΠ΅ΡΠ°", 35}};
// ΠΠ°ΠΉΡΠΈ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ β Π±Π΅Π· Π»ΡΠΌΠ±Π΄Ρ!
auto it = std::ranges::find(people, "ΠΠΎΡΠΈΡ", &Person::name);
// it->age == 25
// Π‘Π°ΠΌΡΠΉ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΉ
auto youngest = std::ranges::min_element(people, {}, &Person::age);
// youngest->name == "ΠΠΎΡΠΈΡ"
// ΠΡΠ΅ Π»ΠΈ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎΠ»Π΅ΡΠ½ΠΈΠ΅?
bool all_adults = std::ranges::all_of(people, [](int a) { return a >= 18; }, &Person::age);
ΠΡΠΎΠ΅ΠΊΡΠΈΡ β ΡΡΠ΅ΡΠΈΠΉ (ΠΈΠ»ΠΈ ΡΠ΅ΡΠ²ΡΡΡΡΠΉ) Π°ΡΠ³ΡΠΌΠ΅Π½Ρ. ΠΠ½Π° Β«ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΡΒ» Π½ΡΠΆΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΏΠ΅ΡΠ΅Π΄ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ΠΌ. ΠΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ Π³ΡΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠ΅ Π»ΡΠΌΠ±Π΄Ρ Π²ΠΈΠ΄Π° [](const Person& p) { return p.age; } β Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ &Person::age.
βοΈ ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π² find ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΌ std::string{"ΠΠΎΡΠΈΡ"}, Π° Π½Π΅ ΡΡΡΠΎΠΊΠΎΠ²ΡΠΉ Π»ΠΈΡΠ΅ΡΠ°Π». ΠΠΈΡΠ΅ΡΠ°Π» "ΠΠΎΡΠΈΡ" ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ const char*, ΠΈ Ρ
ΠΎΡΡ Π½Π΅ΡΠ²Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² std::string Π·Π΄Π΅ΡΡ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠ²Π½Π°Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Π΄Π΅Π»Π°Π΅Ρ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌ.
π©Ή ΠΠΎΠΌΠ±ΠΈΠ½ΠΈΡΡΠ΅ΠΌ Ρ views
std::map<std::string, std::vector<int>> data = {
{"alpha", {1, 2, 3}},
{"beta", {4, 5}},
{"gamma", {6, 7, 8, 9}},
};
// Π‘ΠΊΠΎΠ»ΡΠΊΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π±ΠΎΠ»ΡΡΠ΅ 5 Π²ΠΎ Π²ΡΠ΅Ρ
Π²Π΅ΠΊΡΠΎΡΠ°Ρ
?
auto all_values = data | views::values | views::join;
auto count = std::ranges::count_if(all_values, [](int x) { return x > 5; });
// 4 (6, 7, 8, 9)
views::values ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ Π²ΡΠΎΡΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΏΠ°Ρ (Π²Π΅ΠΊΡΠΎΡΡ), Π° views::join ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΡΡΠΎΠ²Π΅Π½Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡΠΈ β ΡΠΊΠ»Π΅ΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ Π²Π΅ΠΊΡΠΎΡΡ Π² Π΅Π΄ΠΈΠ½ΡΠΉ ΠΏΠ»ΠΎΡΠΊΠΈΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² Π»ΡΠ±ΠΎΠΉ ranges-Π°Π»Π³ΠΎΡΠΈΡΠΌ.
πΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° C/C++ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
#ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½Π°Ρ_ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡsleep_for(100ms) ΡΡΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, Π½ΠΎ Π½Π΅ ΡΠΎΡΠ½ΠΎΠ³ΠΎ
π Ranges:
β’ ΠΠ»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ: views::join ΠΈ views::join_with
β’ Ranges: Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ Π°Π΄Π°ΠΏΡΠ΅ΡΡ
πΉπΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° C/C++ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
#ΡΠ²Π΅ΠΆΠ°ΠΊ#include <mutex>
#include <thread>
#include <vector>
#include <iostream>
std::mutex mtx;
std::vector<int> data;
void producer() {
for (int i = 0; i < 100; ++i) {
std::lock_guard<std::mutex> lock(mtx);
data.push_back(i);
}
}
void consumer() {
while (true) {
std::lock_guard<std::mutex> lock(mtx);
if (data.empty()) {
// ΠΠ΄ΡΠΌ Π΄Π°Π½Π½ΡΠ΅...
std::this_thread::sleep_for(
std::chrono::milliseconds(10));
continue;
}
std::cout << data.back() << "\n";
data.pop_back();
}
}
ΠΠΎΠΏΡΠΎΡ: ΡΡΠΎ Π½Π΅ ΡΠ°ΠΊ Ρ consumer()? ΠΠΎΡΠ΅ΠΌΡ lock_guard Π·Π΄Π΅ΡΡ β ΠΏΠ»ΠΎΡ
ΠΎΠΉ Π²ΡΠ±ΠΎΡ ΠΈ ΠΊΠ°ΠΊ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ?
πΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° C/C++ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
#ΠΌΠ΅ΠΆΠ΄ΡΡΠΎΠ±ΠΎΠΉΡΠΈΠΊ#include <mutex>
#include <thread>
#include <vector>
#include <iostream>
std::mutex mtx;
std::vector<int> data;
void producer() {
for (int i = 0; i < 100; ++i) {
std::lock_guard<std::mutex> lock(mtx);
data.push_back(i);
}
}
void consumer() {
while (true) {
std::lock_guard<std::mutex> lock(mtx);
if (data.empty()) {
// ΠΠ΄ΡΠΌ Π΄Π°Π½Π½ΡΠ΅...
std::this_thread::sleep_for(
std::chrono::milliseconds(10));
continue;
}
std::cout << data.back() << "\n";
data.pop_back();
}
}
ΠΠΎΠΏΡΠΎΡ: ΡΡΠΎ Π½Π΅ ΡΠ°ΠΊ Ρ consumer()? ΠΠΎΡΠ΅ΠΌΡ lock_guard Π·Π΄Π΅ΡΡ β ΠΏΠ»ΠΎΡ
ΠΎΠΉ Π²ΡΠ±ΠΎΡ ΠΈ ΠΊΠ°ΠΊ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ?
πΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° C/C++ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
#ΠΌΠ΅ΠΆΠ΄ΡΡΠΎΠ±ΠΎΠΉΡΠΈΠΊsleep_for(100ms) ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡ ΠΏΠΎΡΠΎΠΊ ΡΠΎΠ²Π½ΠΎ Π½Π° 100 ΠΌΡ, ΡΠΎ ΡΡΠΎ Π½Π΅ ΡΠ°ΠΊ. ΠΠ° Π΄Π΅Π»Π΅ β ΡΡΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, Π½Π΅ ΡΠΎΡΠ½ΠΎΠ΅.
ΠΠΎΠ³Π΄Π° ΡΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡ std::this_thread::sleep_for, ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅: ΠΏΠΎΡΠΎΠΊ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ WAITING Π² ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ΅ ΠΠ‘. Π―Π΄ΡΠΎ ΡΡΠ°Π²ΠΈΡ ΡΠ°ΠΉΠΌΠ΅Ρ ΠΈ ΡΠ±ΠΈΡΠ°Π΅Ρ ΠΏΠΎΡΠΎΠΊ ΠΈΠ· ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π½Π° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠΠΎΠ³Π΄Π° ΡΠ°ΠΉΠΌΠ΅Ρ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ, ΠΏΠΎΡΠΎΠΊ Π½Π΅ ΠΏΡΠΎΡΡΠΏΠ°Π΅ΡΡΡ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ β ΠΎΠ½ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² ready queue ΠΈ ΠΆΠ΄ΡΡ, ΠΏΠΎΠΊΠ° ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ Π²ΡΠ΄Π΅Π»ΠΈΡ Π΅ΠΌΡ ΠΊΠ²Π°Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
auto start = std::chrono::steady_clock::now();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
auto elapsed = std::chrono::steady_clock::now() - start;
// elapsed ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ 102ms, 115ms, Π΄Π°ΠΆΠ΅ 130ms
β‘οΈ ΠΠ° Linux Π³ΡΠ°Π½ΡΠ»ΡΡΠ½ΠΎΡΡΡ ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ β ΠΎΠΊΠΎΠ»ΠΎ 1β4 ΠΌΡ (Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ CONFIG_HZ). ΠΠ° Windows β ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈ 15.6 ΠΌΡ, Π΅ΡΠ»ΠΈ Π½Π΅ Π²ΡΠ·Π²Π°ΡΡ timeBeginPeriod(1)
π‘ ΠΡΠ»ΠΈ Π½ΡΠΆΠ½Π° ΡΠΎΡΠ½ΠΎΡΡΡ Π½ΠΈΠΆΠ΅ ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Ρ β ΠΠ‘-ΠΏΠ°ΡΠ·Π° Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡΡ. ΠΠ»Ρ ΡΠ°ΠΊΠΈΡ
Π·Π°Π΄Π°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ spin-wait Ρ std::chrono::high_resolution_clock, ΠΆΠ΅ΡΡΠ²ΡΡ CPU ΡΠ°Π΄ΠΈ ΡΠΎΡΠ½ΠΎΡΡΠΈ.
πΈ Π£ΡΠΈΡΡΠ²Π°ΠΉ ΡΡΠΎ ΠΏΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π»ΡΠ±ΠΎΠ³ΠΎ setPause-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠ° Π² game loop ΠΈΠ»ΠΈ real-time ΡΠΈΡΡΠ΅ΠΌΠ°Ρ
.
πΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° C/C++ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
#ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½Π°Ρ_ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡstd::vector<int> v = {1, 2, 3, 4, 5};
for (int x : v | views::reverse) {
std::cout << x << " "; // 5 4 3 2 1
}
βοΈ Π’ΡΠ΅Π±ΡΠ΅Ρ bidirectional_range. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, views::filter ΠΌΠΎΠ΄Π΅Π»ΠΈΡΡΠ΅Ρ bidirectional_range, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΡΠ°ΠΌ bidirectional_range ΠΈ common_range β ΡΠ°ΠΊ ΡΡΠΎ Π΄Π»Ρ vector, deque ΠΈΠ»ΠΈ list ΡΠ΅ΠΏΠΎΡΠΊΠ° views::filter(...) | views::reverse ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π° Π΄Π»Ρ forward_list ΠΈΠ»ΠΈ istream_view β Π½Π΅Ρ.
π views::keys ΠΈ views::values β Π΄Π»Ρ ΠΏΠ°Ρ ΠΈ map
std::map<std::string, int> ages = {{"ΠΠ»ΠΈΡΠ°", 30}, {"ΠΠΎΡΠΈΡ", 25}};
for (const auto& name : ages | views::keys) {
std::cout << name << "\n"; // ΠΠ»ΠΈΡΠ°, ΠΠΎΡΠΈΡ
}
for (int age : ages | views::values) {
std::cout << age << "\n"; // 30, 25
}
ΠΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ views::keys β ΡΡΠΎ views::elements<0>, Π° views::values β views::elements<1>. Π Π°Π±ΠΎΡΠ°Π΅Ρ Ρ Π»ΡΠ±ΡΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ, ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ std::pair ΠΈΠ»ΠΈ std::tuple-ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠΉ ΡΠΈΠΏ.
π views::elements<N> β N-ΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ tuple/pair
std::vector<std::tuple<int, std::string, double>> records = {
{1, "Alice", 3.14},
{2, "Bob", 2.71},
};
// ΠΠ΅ΡΡΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊΠΈ (ΠΈΠ½Π΄Π΅ΠΊΡ 1)
for (const auto& s : records | views::elements<1>) {
std::cout << s << "\n"; // Alice, Bob
}
ΠΠ±ΠΎΠ±ΡΡΠ½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ keys/values β ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ N ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΡΡΠ΅ΠΆΠ°. ΠΠ½Π΄Π΅ΠΊΡ Π·Π°Π΄Π°ΡΡΡΡ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΡ
ΠΎΠ΄ Π·Π° Π³ΡΠ°Π½ΠΈΡΡ β ΠΎΡΠΈΠ±ΠΊΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, Π° Π½Π΅ UB.
π views::counted β N ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π½Π°ΡΠΈΠ½Π°Ρ Ρ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠ°
std::vector<int> v = {10, 20, 30, 40, 50};
auto it = v.begin() + 1; // ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° 20
// 3 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π½Π°ΡΠΈΠ½Π°Ρ Ρ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ 1
auto three = views::counted(it, 3);
// 20, 30, 40
Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ views::take, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ, counted ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ + ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ. ΠΡΠΎ Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ Π²Π°Ρ Β«Π³ΠΎΠ»ΡΠΉΒ» ΠΈΡΠ΅ΡΠ°ΡΠΎΡ Π±Π΅Π· ΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ end β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ C-ΠΌΠ°ΡΡΠΈΠ²Π° ΠΈΠ»ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ std::find.
βοΈ ΠΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ Π·Π° ΡΠΎ, ΡΡΠΎ it + n Π½Π΅ Π²ΡΡ
ΠΎΠ΄ΠΈΡ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ, Π»Π΅ΠΆΠΈΡ Π½Π° Π²Π°Ρ β ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ΅ Π½Π΅Ρ.
πΏ views::all β ΠΎΠ±Π΅ΡΠ½ΡΡΡ Π² view ΡΠ²Π½ΠΎ
std::vector<int> v = {1, 2, 3};
// views::all ΡΠ²Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ view ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
auto all_view = views::all(v);
// ΠΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ Π² ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠ΅ view
ΠΠ°ΡΠ΅ΠΌ Π½ΡΠΆΠ΅Π½, Π΅ΡΠ»ΠΈ | ΠΈ ΡΠ°ΠΊ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅Ρ? ΠΡΠ²Π°Π΅Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π² ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ viewable_range, ΠΈΠ»ΠΈ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ view Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±Π΅Π· auto&&. ΠΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ views::all Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅ΡΠ²Π½ΠΎ ΠΏΠΎΡΡΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ΅ΠΏΠΎΡΠΊΠ΅ β Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° ΡΠ²Π½ΡΠΉ Π²ΡΠ·ΠΎΠ² Π΄Π΅Π»Π°Π΅Ρ ΠΊΠΎΠ΄ ΡΡΠ½Π΅Π΅.
π views::common β ΡΠ΄Π΅Π»Π°ΡΡ begin/end ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°
ΠΠ½ΠΎΠ³ΠΈΠ΅ Β«ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅Β» Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΎΠΆΠΈΠ΄Π°ΡΡ, ΡΡΠΎ begin() ΠΈ end() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠΈΠΏ. Π£ Π»Π΅Π½ΠΈΠ²ΡΡ
view ΡΡΠΎ ΡΠ°ΡΡΠΎ Π½Π΅ ΡΠ°ΠΊ β end() ΠΌΠΎΠΆΠ΅Ρ Π²Π΅ΡΠ½ΡΡΡ sentinel, Π° Π½Π΅ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ.
auto view = some_range | views::filter(...);
// ΠΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² ΡΡΠ°ΡΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ, ΡΡΠ΅Π±ΡΡΡΠΈΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°:
auto common_view = view | views::common;
std::copy(common_view.begin(), common_view.end(), output);
βοΈ ΠΡΠ»ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΡΠΆΠ΅ common_range, Π°Π΄Π°ΠΏΡΠ΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ β ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΠΊΠ°ΠΊ Π΅ΡΡΡ. ΠΠ°ΠΊΠ»Π°Π΄Π½ΡΡ
ΡΠ°ΡΡ
ΠΎΠ΄ΠΎΠ² Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½ΠΎΠ»Ρ.
π©Ή ΠΠΎΠΌΠ±ΠΈΠ½ΠΈΡΡΠ΅ΠΌ Π²ΡΡ Π²ΠΌΠ΅ΡΡΠ΅
std::map<std::string, std::vector<int>> data = {
{"alpha", {1, 2, 3}},
{"beta", {4, 5}},
{"gamma", {6, 7, 8, 9}},
};
// ΠΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ β ΡΠΏΠ»ΡΡΠΈΡΡ β ΠΎΠ±ΡΠ°ΡΠ½ΡΠΉ ΠΏΠΎΡΡΠ΄ΠΎΠΊ β ΠΏΠ΅ΡΠ²ΡΠ΅ 4
auto result = data
| views::values
| views::join
| views::reverse
| views::take(4);
for (int x : result) {
std::cout << x << " "; // 9 8 7 6
}
ΠΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° β ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΡΠΎΡΡΠ³ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· Π²ΡΡ ΡΠ΅ΠΏΠΎΡΠΊΡ Π»Π΅Π½ΠΈΠ²ΠΎ, ΠΏΠΎ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ.
πΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ: ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ β’ ΠΠ°Π΄Π°ΡΠΈ β’ Π‘ΠΎΠ±Π΅ΡΡ
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° C/C++ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
#ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½Π°Ρ_ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡβKV-cache hit rate is the single most important metric for a production-stage AI agent.βπ Π§ΡΠΎ Π²Π½ΡΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠΊΠΈ (ΠΊΠΎΠΌΠ±ΠΎ ΠΈΠ· 3 ΡΡΠ°ΡΠ΅ΠΉ + ΠΊΠΎΠ΄):
ΠΠΊΠΎΠ½ΠΎΠΌΠΈΠΊΠ° ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ β ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ² ΠΈ ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ Π·Π°ΡΡΠ°ΡΡ. Π§Π°ΡΡΡΠ΅ Π°Π½ΡΠΈ-ΠΏΠ°ΡΡΠ΅ΡΠ½Ρ β ΠΏΠΎΡΠ΅ΠΌΡ Π²Π°Ρ ΠΊΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ ΠΈ Π²Ρ ΠΏΠ»Π°ΡΠΈΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅. ΠΡΡ Π² AI-Π°Π³Π΅Π½ΡΠ°Ρ β ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ° ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠ°ΠΌΡΡΡΡ Π² Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ .π ΠΠΈΡΠ΅Π½ΠΊΠ° Π½Π° ΡΠΎΡΡΠ΅: Π³ΠΎΡΠΎΠ²ΡΠΉ SKILL Π΄Π»Ρ Π°Π³Π΅Π½ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π΅Π»Π°Π΅Ρ ΡΠ΅Π²ΡΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π½Π°Ρ ΠΎΠ΄ΠΈΡ Π°Π½ΡΠΈ-ΠΏΠ°ΡΡΠ΅ΡΠ½Ρ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΈΠ·ΠΊΠΎΠ΅ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ Π² ΠΊΡΡ. β ΠΠ°Π±ΡΠ°ΡΡ ΠΊΠΎΠΌΠ±ΠΎ-ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ Π½Π° GitHub P.S. ΠΡΠ»ΠΈ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠΎΡΠ»ΡΡΠ°ΡΡ Π‘Π΅ΡΠ³Π΅Ρ Π²ΠΆΠΈΠ²ΡΡ β Π»ΠΎΠ²ΠΈΡΠ΅ Π΅Π³ΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ΅Π½ΡΠΈΡΡ Kode Waves (ΠΌΠ°ΠΉ), Conversations AI ΠΈ Highload Spb (ΠΈΡΠ½Ρ). π ΠΠΊΡΠΈΡ Π² ΡΠ΅ΡΡΡ ΡΡΠ°ΡΡΠ° ΠΏΡΠΎΠ΄Π°ΠΆ! ΠΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ ΠΏΡΠΈ ΠΏΠΎΠΊΡΠΏΠΊΠ΅ ΠΠ½ΠΆΠ΅Π½Π΅ΡΠ½ΠΎΠ³ΠΎ ΡΡΠ΅ΠΊΠ° Π²Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ ΠΏΠΎΠ»Π½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°ΠΌ ΠΊΡΡΡΠ° Β«Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΠ-Π°Π³Π΅Π½ΡΠΎΠ²Β» Π² ΠΏΠΎΠ΄Π°ΡΠΎΠΊ. π ΠΠ°Π±ΡΠ°ΡΡ 2 ΠΊΡΡΡΠ° ΠΏΠΎ ΡΠ΅Π½Π΅ 1 ΠΈ Π½Π°ΡΠ°ΡΡ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅
