Richard Biener oznámil vydání verze 16.1 (16.1.0) kolekce kompilátorů pro různé programovací jazyky GCC (GNU Compiler Collection). Jedná se o první stabilní verzi řady 16. Přehled změn, nových vlastností a oprav a aktualizovaná dokumentace na stránkách projektu. Některé zdrojové kódy, které bylo možné přeložit s předchozími verzemi GCC, bude nutné upravit.
Zulip Server z open source komunikační platformy Zulip (Wikipedie, GitHub) byl vydán ve verzi 12.0. Přehled novinek v příspěvku na blogu.
Před 30 lety, tj. v úterý 30. dubna 1996, byl spuštěn Seznam.cz.
Byly zpracovány a zveřejněny všechny videozáznamy, které stojí za zveřejnění, z konference FOSDEM 2026.
Od úterý 28. dubna musí nově uváděné notebooky v Evropské unii podporovat nabíjení přes USB-C. Jednotná nabíječka byla schválena Evropským parlamentem v říjnu 2022.
Byly publikovány informace o kritické zranitelnosti CVE-2026-31431 pojmenované Copy Fail v Linuxu, konkrétně v kryptografii (AF_ALG). Běžný uživatel může získat práva roota (lokální eskalaci práv). Na všech distribucích Linuxu vydaných od roku 2017. Pomocí 732bajtového skriptu. V upstreamu je již opraveno. Zranitelnost byla nalezena pomocí AI Xint Code.
Textový editor Zed dospěl do verze 1.0. Představení v příspěvku na blogu.
Vývojáři svobodného 3D softwaru Blender představili (𝕏, Mastodon, Bluesky) nejnovějšího firemního sponzora Blenderu. Je ním společnost Anthropic stojící za AI Claude a úroveň sponzoringu je Patron, tj. minimálně 240 tisíc eur ročně. Anthropic oznámil sponzorství v tiskové zprávě Claude for Creative Work.
VNC server wayvnc pro Wayland kompozitory postavené nad wlroots - ne GNOME, KDE nebo Weston - byl vydán ve verzi 0.10.0. Vydána byla také verze 1.0.0 související knihovny neatvnc.
Bylo oznámeno vydání Fedora Linuxu 44. Ve finální verzi vychází šest oficiálních edic: Fedora Workstation a Fedora KDE Plasma Desktop pro desktopové, Fedora Server pro serverové, Fedora IoT pro internet věcí, Fedora Cloud pro cloudové nasazení a Fedora CoreOS pro ty, kteří preferují neměnné systémy. Vedle nich jsou k dispozici také další atomické desktopy, spiny a laby. Podrobný přehled novinek v samostatných článcích na stránkách
… více »
Před řazením:
{ {"data 0", 0}, {"data 1", 1}, {"data 2", 2} }
Po řazení podle toho řetězce opačně:
{ {"data 2", 0}, {"data 1", 1}, {"data 0", 2} }
struct Prvek
{
// nejaka data
size_t index_v_poli;
};
Pak mám pole těch prvků, resp. v poli budou nakonec ukazatele na dané prvky, protože chci, aby se neměnila jejich adresa:
{
{ /* ... */, 0 },
{ /* ... */, 1 },
{ /* ... */, 2 },
{ /* ... */, 3 },
{ /* ... */, 4 },
}
Z pole si někam třeba uložim položku s indexem 2, dostanu Prvek*, ukazující na { /* ... */, 2 }. Pak třeba do pole něco přidám, nebo ho nějak jinak seřadím. Chci, aby se index ve vráceném prvku patřičně aktualizoval, aby měl správný index a já pak mohl říct třeba "smaž prvek Prvek*" a nemusel ho v poli vyhledávat v O(n).
Tak tady je ještě obecnější řešení než níže uvedené. Třídit můžeš implicitně pomocí std::set a std::map. Implementace jsou vyvážené stromy a nikde tam ani náhodou nehrozí hledání v O(n). Můžeš si podle potřeby udržovat několik různě setříděných „pohledů“ do téže datové struktury.
#include <map>
#include <set>
#include <string>
struct Something {
std::string blah;
size_t index;
};
static std::ostream& operator <<(std::ostream &out, const Something &sth) {
out << "{\"" << sth.blah << "\", " << sth.index << "}";
return out;
}
struct CompareSomething {
bool operator ()(const Something *const &left,
const Something *const &right) const {
return left->blah > right->blah;
}
};
template<template<typename ... Args> class M, typename ... Args>
static void printmap(const M<Args...> &map, const std::string &message) {
const auto end{map.cend()};
auto i{map.cbegin()};
std::cout << message << std::endl << '{';
if (i != end) {
std::cout << '{' << i->first << ", " << i->second << '}';
for (++i; i != end; ++i)
std::cout << ", " << '{' << i->first << ", " << i->second << '}';
}
std::cout << '}' << std::endl;
}
int main() {
std::map<size_t, Something> indexmap{
{0, {"data 0", 0}}, {1, {"data 1", 1}}, {2, {"data 2", 2}}};
std::set<const Something*, CompareSomething> sortedview;
for (const auto &pair : indexmap) sortedview.insert(&pair.second);
printmap(indexmap, "Původní stav:");
auto first{sortedview.cbegin()};
indexmap.erase((*first)->index);
sortedview.erase(first);
printmap(indexmap, "Stav po odebrání prvního podle třídění:");
indexmap.emplace(3, Something{"data 3", 3});
sortedview.insert(&indexmap[3]);
printmap(indexmap, "Stav po přidání dalšího prvku:");
auto second{sortedview.cbegin()};
++second;
indexmap.erase((*second)->index);
sortedview.erase(second);
printmap(indexmap, "Stav po odebrání druhého podle třídění:");
return 0;
}
Dlužno dodat, že v tomto případě by bylo výrazně jednodušší použít místo Something jednoduše rovnou std::pair<size_t, std::string>. Tím by zmizela jedna úroveň zanoření struktur. Výše uvedený program vypíše:
Původní stav:
{{0, {"data 0", 0}}, {1, {"data 1", 1}}, {2, {"data 2", 2}}}
Stav po odebrání prvního podle třídění:
{{0, {"data 0", 0}}, {1, {"data 1", 1}}}
Stav po přidání dalšího prvku:
{{0, {"data 0", 0}}, {1, {"data 1", 1}}, {3, {"data 3", 3}}}
Stav po odebrání druhého podle třídění:
{{0, {"data 0", 0}}, {3, {"data 3", 3}}}
Ano, je na to standardní algoritmus zvaný std::sort(). Aktualizaci indexů si pak už musíš napsat sám, což ale není nijak extra těžké:
#include <algorithm>
#include <iostream>
#include <string>
struct Something {
std::string blah;
size_t index;
bool operator <(const Something &right) const { return blah > right.blah; }
};
static std::ostream& operator <<(std::ostream &out, const Something &sth) {
out << "{\"" << sth.blah << "\", " << sth.index << "}";
return out;
}
template<typename T, size_t N>
void printarray(const T(&array)[N], const std::string &message) {
const auto begin{std::begin(array)}, end{std::end(array)};
std::cout << message << std::endl << '{';
if (begin < end) {
std::cout << *begin;
for (auto i{begin + 1}; i < end; ++i) std::cout << ", " << *i;
}
std::cout << '}' << std::endl;
}
int main() {
Something array[]{{"data 0", 0}, {"data 1", 1}, {"data 2", 2}};
printarray(array, "Počáteční stav:");
std::sort(std::begin(array), std::end(array));
printarray(array, "Stav po std::sort():");
size_t counter{0};
for (Something &s : array) s.index = counter++;
printarray(array, "Stav po aktualizaci indexů:");
return 0;
}
Výše uvedený program vypíše následující:
Počáteční stav:
{{"data 0", 0}, {"data 1", 1}, {"data 2", 2}}
Stav po std::sort():
{{"data 2", 2}, {"data 1", 1}, {"data 0", 0}}
Stav po aktualizaci indexů:
{{"data 2", 0}, {"data 1", 1}, {"data 0", 2}}
Tiskni
Sdílej: