Z upstreamu GNOME Mutter byl zcela odstraněn backend X11. GNOME 50 tedy poběží už pouze nad Waylandem. Aplikace pro X11 budou využívat XWayland.
Byl publikován plán na odstranění XSLT z webových prohlížečů Chrome a Chromium. S odstraněním XSLT souhlasí také vývojáři Firefoxu a WebKit. Důvodem jsou bezpečnostní rizika a klesající využití v moderním webovém vývoji.
Desktopové prostředí LXQt (Lightweight Qt Desktop Environment, Wikipedie) vzniklé sloučením projektů Razor-qt a LXDE bylo vydáno ve verzi 2.3.0. Přehled novinek v poznámkách k vydání.
Organizace Open Container Initiative (OCI) (Wikipedie), projekt nadace Linux Foundation, vydala Runtime Specification 1.3 (pdf), tj. novou verzi specifikace kontejnerového běhového prostředí. Hlavní novinkou je podpora FreeBSD.
Nový open source router Turris Omnia NG je v prodeji. Aktuálně na Allegro, Alternetivo, Discomp, i4wifi a WiFiShop.
Na YouTube a nově také na VHSky byly zveřejněny sestříhané videozáznamy přednášek z letošního OpenAltu.
Jednou za rok otevírá společnost SUSE dveře svých kanceláří široké veřejnosti. Letos je pro vás otevře 26. listopadu v 16 hodin v pražském Karlíně. Vítáni jsou všichni, kdo se chtějí dozvědět více o práci vývojářů, prostředí ve kterém pracují a o místní firemní kultuře. Můžete se těšit na krátké prezentace, které vám přiblíží, na čem inženýři v Praze pracují, jak spolupracují se zákazníky, partnery i studenty, proč mají rádi open source a co
… více »Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za říjen (YouTube).
Jeff Quast otestoval současné emulátory terminálu. Zaměřil se na podporu Unicode a výkon. Vítězným emulátorem terminálu je Ghostty.
Amazon bude poskytovat cloudové služby OpenAI. Cloudová divize Amazon Web Services (AWS) uzavřela s OpenAI víceletou smlouvu za 38 miliard USD (803,1 miliardy Kč), která poskytne majiteli chatovacího robota s umělou inteligencí (AI) ChatGPT přístup ke stovkám tisíc grafických procesů Nvidia. Ty bude moci využívat k trénování a provozování svých modelů AI. Firmy to oznámily v dnešní tiskové zprávě. Společnost OpenAI také nedávno
… 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: