Nima uchun std :: sozlamalari "o'z ichiga olgan" a'zo funktsiyasiga ega emas?

I'm heavily using std::set and often I simply need to check if such a set contains a number or not.

Men buni tabiiy deb bilaman:

if (myset.contains(number))
   ...

Lekin tarkibida mavjud bo'lmaganligi sababli a'zo bo'lganligi sababli, noqulay yozish kerak:

if (myset.find(number) != myset.end())
  ..

yoki aniq emas:

if (myset.count(element) > 0) 
  ..

Ushbu dizayn qarorining sababi bormi?

91
@TobySpeight Men "C ++ yo'li" haqida emas, balki aytmoqchi emasman: masalan. std :: string push_back (CharT) , asosan operator + = (CharT) bilan bir xil bo'ladi; hajmi ga qo'shimcha ravishda uzunligi ham mavjud, bu ham interfeysni har qanday qo'shimcha funktsiyani yoqmasdan oshiradi va hokazo.
qo'shib qo'ydi muallif Ruslan, manba
@Alien Qanday qilib bunday emas? set :: has_more_than (n) yoki multiset :: erase_once (x) kabi juda yoqimli funksiyalarning yarmidan ko'pini o'ylayman. Bizda bunga ega bo'lmaslikning sabablari bormi?
qo'shib qo'ydi muallif Dmitry Grigoryev, manba
Taklifni ko'ring Uyushmalardagi elementlarning mavjudligini tekshirish Konteynerlar nima holat ishonch hosil emas.
qo'shib qo'ydi muallif Shafik Yaghmour, manba
Bolalar, albatta, qayta ochiladi. Quyidagi 7 ta javobdan 6 tasi fikr. Ushbu savol POBni etarlicha tez o'chirmasligingiz bilan nima sodir bo'lishidan dalolat beradi. Bu erda xavf-xatar yuqoridagi savolga to'g'ri javob bergan o'quvchilardir. OSh eng kamida bu erda faqat to'g'ri javobni qabul qilishi kerak . Bir qismim bu dunyoni noto'g'ri ma'lumotlardan himoya qilish uchun uni yo'q qilishni istaydi.
qo'shib qo'ydi muallif Jason C, manba
@Alien Qanday bo'lmasin? Men qabul qilingan javobni "Menimcha, ehtimol, chunki" deb boshlanadi va shaxsiy nazariya bilan ("sharhda muqobil bo'lishi mumkin" degan juda yaxshi mulohazani nazarda tutmaslik kerak) boshlanadi. Bu yerga keladigan eng yaxshisidir. Qolganlari o'xshash. Endi agar WG21 qo'mitasining majlisidan haqiqiy dizaynga asoslangan mantiqqa asoslanib gapiradigan bo'lsak, albatta, lekin bu erda hech qanday javob, ehtimol Leoning ketidan boshqa hech narsa asoslanmagan, ammo tasodifiy taxminlar mavjud.
qo'shib qo'ydi muallif Jason C, manba
Bu kunlarda hamma narsani yopamizmi? Qanday qilib bu savol "asosan fikrga asoslanadi" degan savolga javob beradi?
qo'shib qo'ydi muallif Mr. Alien, manba
Standart kutubxonaning aksariyat qismi iteratorlar bilan ishlaydi, shuning uchun odatdagidek, iteratorlarni qaytadan ishga tushirish vazifasi siz kutgan narsadir. Buni mavhum qilish uchun funktsiyani yozish qiyin emas. Ehtimol, derleyici faqatgina bitta satr yoki 2 kod bo'lishi kerak, chunki u bir xil ishni bajaradi.
qo'shib qo'ydi muallif NathanOliver, manba
To'siqning umumiy interfeysidan foydalangan holda o'z ichiga olgan (to'siq, element) funksiyasini bepul yozishni osonlashtiradi. Shuning uchun, setning interfeysi funksional ravishda bajarilgan; qulaylik uslubini qo'shish faqat C ++ uslubi bo'lmagan qo'shimcha funktsiyalarni yoqtirmasdan interfeysni oshiradi.
qo'shib qo'ydi muallif Toby Speight, manba
Men bu haqda hali hech kim gapirganiga hayron bo'lmayman, ammo bu savolga C ++ 20 tomonidan OBE bo'ladi: en.cppreference.com/w/cpp/container/set/apptains
qo'shib qo'ydi muallif user3288829, manba
Ushbu dizayn qarori ortidagi asosiy sababi bool funksiyasini qaytaradigan contains() elementning qaerda joylashganligi haqida qimmatli ma'lumotni yo'qotishidir yig'ish . find() bu ma'lumotni yineleyici shaklida saqlaydi va qaytaradi, shuning uchun STL kabi umumiy kutubxona uchun yaxshiroq tanlovdir. (Ya'ni, bool contains() ) juda yoqimli yoki hatto kerak emas.)
qo'shib qo'ydi muallif Leo Heinsaar, manba
count() yondashuvi bilan boshqa (yana asosiy) muammo - bu tog '() ga qaraganda ko'proq ishlashi.
qo'shib qo'ydi muallif Leo Heinsaar, manba

7 javoblar

Ehtimol, ular std :: set va std :: multiset ni imkon qadar o'xshash qilishga harakat qilishgan. (Va, albatta, count ) std :: multiset uchun juda yaxshi ma'noga ega.)

Shaxsan men bu xatolik deb o'ylayman.

Agar count kodi xatosini keltirib chiqaradigan bo'lsa, testni quyidagicha yozing:

if (myset.count(element)) 
   ...

Garchi sharmanda bo'lsa ham.

141
qo'shib qo'ydi
@JustinTime count ni mantiqiy ravishda count ga teng kontseptual deb atash mumkin bo'lsa-da, count birinchi matchni topish bilanoq, kod , u butun to'plam qidirishni davom ettirishi mumkin. Dizaynerlar ushbu ishlash muammosi haqida g'amxo'rlik qiluvchi programlovchilarni .count() o'rniga .find ()! = .End() dan foydalanishni kutadi deb o'ylayman; juda yomon .end() falsey emas.
qo'shib qo'ydi muallif Barmar, manba
Yetishmayapti? agar bo'lsa (myset.ICanHaz (element)) ... : D.
qo'shib qo'ydi muallif Stéphane Gourichon, manba
Bu o'rinli bo'ladi.
qo'shib qo'ydi muallif Jabberwocky, manba
Sizning kodingiz to'siq va multiset ni saqlab qolish niyatida bo'lgan har qanday manbangiz bormi? Ushbu javob juda ko'p ovoz bergan va qabul qilinadigan bo'lsa, shaxsiy nazariyadan ko'ra ko'proq ko'rinadi va Ushbu mavzu bo'yicha haqiqiy taklif guruhidagi muhokamalar . Ehtimol, butunlay noto'g'ri.
qo'shib qo'ydi muallif Jason C, manba
@MartinBonner Chiqarish sabablari behuda emasmi, degani emas. U suhbat 100% yakuniy mantiqiy emasligini ham aniqlamaydi. Javobingiz bu erda kerak deb o'ylayman. Suhbat va javob faqatgina unga aloqador emas, balki uni taklif qilish (agar ular yo'q bo'lsa ham), bu tasavvurga qaramasdan, haqiqatdan ham haqiqatga yaqinroqdir. Eng kamida siz bu savolda uni kamida ga kiritishingiz kerak, bu katta o'zgarishlar bo'lishi va bajarilishi uchun mas'ul bo'lgan narsa bo'ladi.
qo'shib qo'ydi muallif Jason C, manba
Bu standart sonning nima bilan bog'liqligi haqida oqilona izoh.
qo'shib qo'ydi muallif Yakk - Adam Nevraumont, manba
Aytgancha, xaritalar va multimapslar bilan xuddi shunday (bu, xuddi chirkin, ammo bu kamchiliklar bilan .end() bilan taqqoslagandan ko'ra yomonroqdir).
qo'shib qo'ydi muallif Matteo Italia, manba
@JustinTime C ++ standart kutubxonasi bilan tanish bo'lmagan odamlar C ++ dasturida bo'lishi kerak.
qo'shib qo'ydi muallif JAB, manba
@MartinBonner "ular ishlatgan bo'lardi va boshqalar hisoblashadi". Yo'q, ular yo'q edi. Ushbu kontseptsiya multimap va multisetni o'z ichiga oladi va contains ular uchun mantiqiy emas, lekin ularning barchasi uchun count mavjud.
qo'shib qo'ydi muallif Slava, manba
Iloji boricha o'xshash emas, lekin ular bir xil tushunchaga amal qiladilar.
qo'shib qo'ydi muallif Slava, manba
@Slava - qaerda ular bir xil bo'lishi mumkin bo'lgan joylarda qaerdan farqlanadi? Agar "bir xil kontseptsiya" bo'lsa, ular o'z ichiga oladi va boshqalar count .
qo'shib qo'ydi muallif Martin Bonner, manba
Menda mavjud bo'lgan yagona manba to'siq va multiset (va ularning xaritadagi hamkorlari) AssociateContainer ( count ) mavjud. Bu ham butun STLning dizayn falsafasiga mos keladi. Men Google guruhlari muhokamasini 2014 yildan boshlab boshlaganini kuzatishim mumkin - 25 yil oldin sodir bo'lgan voqealarga ishora qilyapman (men bu mavzuni oxiriga etkazmaganman).
qo'shib qo'ydi muallif Martin Bonner, manba
To'g'ri. Men hozir barcha ipni o'qib chiqdim va a) 2014 yil va 2015 yil boshidan (original standartlashtirish ishi emas); b) find = end o'rniga count =! = 0 o'rniga sinxronlash sifatida o'z ichiga oladi »va agar agar siz o'z ichiga olgan kodini taqdim qilsangiz, odamlar if (cont.contains (val)) {foydalanish (davomi [val]); } , bu butun ikki qarashlarni o'z ichiga oladi, shuning uchun ham samarasiz. Ushbu oxirgi argumentlar siljishlar uchun qo'llanilmaydi va aslida menda g'amxo'rlik yo'q - men o'qiydigan kodni bajarish uchun baxtli ikkita omilni sotaman.
qo'shib qo'ydi muallif Martin Bonner, manba
@JasonC: Davom etsangiz va pastdagi qismni tahrir qila olasizmi? Men siz yaratmoqchi bo'lgan fikrni chindan ham tushunmayapman va tushuntirishlarning eng yaxshi yo'li bu sharh emas. Rahmat!
qo'shib qo'ydi muallif Martin Bonner, manba
Natijani bool funksiyasi sifatida qaytaradigan funktsiyaga ega bo'lgan holatlar mavjud bo'lsa va o'z ichiga olgan nomi count kodi, to'siq ga yaxshi tanish bo'lmagan odamlar tomonidan kodni tezroq tahlil qilish imkonini beradi.
qo'shib qo'ydi muallif Justin Time, manba
Shu bilan bir qatorda, biron bir std :: set s va shuning uchun keraksiz bo'lganligi sababli qo'shimcha contains() T T natijalari s.contains (t) natijasi static_cast (s.count (t)) natijalariga to'liq mos keladi kodi>. Shartli ifodada qiymatni ishlatish uchun uni bool ga to'g'ridan-to'g'ri translyatsiya qilishadi, ular count() maqsadni etarlicha xizmat qilganligini his qilishgan bo'lishi mumkin.
qo'shib qo'ydi muallif Justin Time, manba
Menga bir xususiyat sifatida ega bo'lishni xohlayman - sinf a'zolari uchun sinfga doir taxallus kabi narsalarni qilish. #Define func_a func_b yozish imkoniyati mavjudligi - global miqyosdagi nomni aniqlaydigan, nega sinfda boshqa taxalluslarni defile qila olmaysiz - shunga o'xshash narsa: alias std :: set :: contains = std :: set :: hisoblash. Bu std :: juftlik a'zolarining nomini o'zgartirish uchun ham foydalidir: alias std :: pair :: name1 = std :: juft :: birinchi
qo'shib qo'ydi muallif Nuclear, manba
std :: multiset uchun .count eng yaxshi variant bo'lmasligi mumkin, chunki agar multisetning barcha elementlari bir xil bo'lsa, u chiziqli murakkablikka tushishi mumkin.
qo'shib qo'ydi muallif Ixanezis, manba

if (s.contains ()) kodini yozish uchun bool (yoki < binary_search kodi kabi yana bir hikoya).

The fundamental reason behind the design decision not to do it this way is that contains() which returns a bool would lose valuable information about where the element is in the collection. find() preserves and returns that information in the form of an iterator, therefore is a better choice for a generic library like STL. This has always been the guiding principle for Alex Stepanov, as he has often explained (for example, here).

count() yondashuviga kelsak, odatda yaxshi vaqtinchalik echim bo'lsa, muammo contains() <// code> qilish kerak. .

That is not to say that a bool contains() isn't a very nice-to-have or even necessary. A while ago we had a long discussion about this very same issue in the ISO C++ Standard - Future Proposals group.

35
qo'shib qo'ydi
std :: set uchun nima qilish kerak include() dan ko'proq ish count() nima ishlaydi? Bu noyobdir, shuning uchun count() bo'lishi mumkin, faqat return contains (x)? 1: 0; - bu aynan bir xil.
qo'shib qo'ydi muallif Timmmm, manba
"... o'z ichiga olgan ma'lumotni yo'qotadi (</>> ) - Agar foydalanuvchi myset.contains() agar u mavjud bo'lsa), bu ma'lumot qimmatli emasligini ko'rsatuvchi juda kuchli indikator bo'ladi (bu kontekstdagi foydalanuvchi uchun).
qo'shib qo'ydi muallif Keith Thompson, manba
std :: set (bu savol so'raladigan narsa) uchun count kodi mavjud bo'lsa, qilmoq. count ning glibc ilovasi (taxminan) return find (value) == end ()? 0: 1; . Ternary operatori haqidagi batafsil ma'lumotlardan tashqari, faqatgina ! = End() (optimallashchining olib tashlanishini kutishim mumkin) qaytganida, men qanday qilib ko'proq ish borligini ko'ra olmayman.
qo'shib qo'ydi muallif Martin Bonner, manba
Shuni ham ta'kidlash joizki, ushbu munozaralar yaqin orada kelishilgan holda yakunlandi va sen ga taklif qilishni so'radi.
qo'shib qo'ydi muallif PJTraill, manba
@PJTraill True va men oldinga bormaganimning sababi shundaki, contains() , mavjud bo'lgan konteynerlar va algoritmlar bilan kuchli ta'sir o'tkazadi, bu esa tushunchalar va intervallarni kuchli ta'sir qiladi C ++ 17 ga o'tishini kutishim kerak edi va men (munozarali va shaxsiy elektron pochta almashinuvi natijasida) ularni birinchi navbatda kutish yaxshiroq bo'lganiga amin bo'ldim. Albatta, 2015-yilda na konsepsiyalar, na qatorlar uni C ++-17 ga aylantirmasligi aniq emas edi (aslida, ularning umidlari katta edi). Shunga qaramay, uni ta'qib etishga arziydi.
qo'shib qo'ydi muallif Leo Heinsaar, manba

Hech kim uni qo'shib qo'ygani yo'q. Hech kim buni qo'shmadi, chunki STLdan olingan konteynerlar std kutubxonasi interfeysida minimal bo'lishi kerak bo'lgan joyni o'z ichiga olgan. (Eslatma: std :: string STL dan xuddi shunday tarzda kelmagan).

Ba'zi g'alati sintaksisga qarshi bo'lmasangiz, uni soxtalashtirishingiz mumkin:

template
struct contains_t {
  K&& k;
  template
  friend bool operator->*( C&& c, contains_t&& ) {
    auto range = std::forward(c).equal_range(std::forward(k));
    return range.first != range.second;
   //faster than:
   //return std::forward(c).count( std::forward(k) ) != 0;
   //for multi-meows with lots of duplicates
  }
};
template
containts_t contains( K&& k ) {
  return {std::forward(k)};
}

foydalanish:

if (some_set->*contains(some_element)) {
}

Ushbu usul yordamida asosan C ++ std turlari uchun kengaytma usullarini yozishingiz mumkin.

Buni amalga oshirish juda mantiqan bo'ladi:

if (some_set.count(some_element)) {
}

lekin kengaytma usuli usuli bilan qiziqaman.

Haqiqatan ham afsuski, multimap yoki multisap ustida samarali o'z ichiga olgan yozishni tezroq bo'lishi mumkin, chunki ular faqat bitta elementni topishi kerak, count har biri ni topishi va ularni hisoblashi kerak. .

1 mlrd. Nusxani tashkil etuvchi 7 ta multisket (bilasizmi, tugallansa) juda sekin .count (7) bo'lishi mumkin, lekin juda tez o'z ichiga olishi mumkin (7)/code>.

Yuqoridagi kengaytma usuli bilan biz pastki bilan solishtirganda lower_bound va undan keyin element bilan taqqoslab, ushbu ish uchun tezroq bajarishimiz mumkin. Buni amalga oshirish uchun tartibga solinmagan meow va tartiblangan meow uchun buni amalga oshirish uchun SFINAE yoki konteynerga maxsus yuklar talab qilinadi.

21
qo'shib qo'ydi
@ user2357112 meow "to'siq yoki xarita" uchun joy egallaydi. Nima uchun STL ga murojaat qiling.
qo'shib qo'ydi muallif Yakk - Adam Nevraumont, manba
@nwp so'zining atrofida backticks etishmasligim, chunki std :: set xususiyati bilan bog'liq emasman. Sizni yaxshi his qilish uchun men ko'p narsalarni qo'shaman
qo'shib qo'ydi muallif Yakk - Adam Nevraumont, manba
Men "meow" ning qandaydir bir havola bo'lishi kerakligi uchun hazilni yo'qotish kabi ko'rinadi.
qo'shib qo'ydi muallif user2357112, manba
@nwp std :: multiset :: count bo'lishi mumkin
qo'shib qo'ydi muallif milleniumbug, manba
7 mlrd. Nusxada? Bu erda std :: to'siq dublikatlar bo'lmasligi va shuning uchun std :: set :: count har doim 0 yoki 1 .
qo'shib qo'ydi muallif nwp, manba

Siz maxsus ishni ko'rib chiqib, katta rasmni ko'rmaysiz. Hujjatlar std :: to'siq da ko'rsatilganidek, talabni qondiradi AssociativeContainer kontseptsiyasidan foydalanishingiz mumkin. Bu tushuncha uchun std :: multiset va std :: multimap uchun juda foydasiz bo'lgani uchun contains >, lekin count ularning barchasi uchun yaxshi ishlaydi. std :: to'siq , std :: map uchun count uchun

12
qo'shib qo'ydi
@Slava Bunga o'xshash size() va empty() so'zlari o'xshashdir, shuning uchun ko'plab konteynerlar ham mavjud.
qo'shib qo'ydi muallif Barry, manba
Eslatma: string - bu yirtqich hayvondir: bu length va katalogga asoslangan barcha usullar va keyinchalik moslashtirilgan "konteyner" bo'lgan STLdan oldin mavjud edi. STL modelida ... orqaga qarab muvofiqligi sabablari mavjud usullarini olib tashlamasdan. GotW # 84: Monoliths Unstrung ga qarang. <> string "a'zo funktsiyalarining minimal miqdori" dizayn printsipini buzadi.
qo'shib qo'ydi muallif Matthieu M., manba
Multiset, multimap yoki xaritada biror narsa bo'lsa, men uchun mukammaldir. Aslida, o'z ichiga oladi bir to'siq/xarita bo'yicha harakatda tengdir, lekin multiset/multimapda count dan tezroq bo'lishi mumkin.
qo'shib qo'ydi muallif Yakk - Adam Nevraumont, manba
AssociativeContainer emas uchun sinflarni talab qilmaydi contains usuli.
qo'shib qo'ydi muallif user2357112, manba
@ user2357112 lekin o'z ichiga olgan kodi count usulini talab qiladi
qo'shib qo'ydi muallif Slava, manba
@Barry Men std :: to'siq yoki std :: map ichiga contains() ni qo'shishga qarshi emasman, faqat men ijodkorlar bor edi. Men ulardan emasman.
qo'shib qo'ydi muallif Slava, manba
@MartinBonner siz faqat std :: set emas, balki AssociativeContainer ni qabul qiladigan umumiy funktsiyani yozishingiz mumkin. Tilga tushunchalar qo'shilsa (men umid qilamanki) bu ko'proq mantiqiy bo'ladi.
qo'shib qo'ydi muallif Slava, manba
Ammo keyin savol "Nega bu kabi AssociateContainer konsepsiyasiga ega bo'lish kerak?" - va men uning oldida turganiga amin emasman.
qo'shib qo'ydi muallif Martin Bonner, manba

std :: to'siq 0 yoki faqat 0 yoki taymer kodini qaytarmaganini bilmayman 1 , shabloni o'z ichiga oladi yordamchi funktsiyani quyidagi kabi yozishingiz mumkin:

template
auto contains(const Container& v, const T& x)
-> decltype(v.find(x) != v.end())
{
    return v.find(x) != v.end();
}

Va shunga o'xshash tarzda foydalaning:

    if (contains(myset, element)) ...
10
qo'shib qo'ydi
Kod multiset bilan almashtirilgan bo'lsa, toping ni ikki marta bajarish kerakligi uchun @MatteoItalia count asta-sekin bo'lishi mumkin./code>.
qo'shib qo'ydi muallif Mark Ransom, manba
bool bo'lsa, nima uchun farasingiz auto deklaratsiyasi oddiy va oson o'qilishi mumkin?
qo'shib qo'ydi muallif Mark Ransom, manba
OP hozircha keraksiz ekanligini biladi, lekin kodni ochiq kodni o'z ichiga olgan o'qilishini xohlaydi. Buning yomon joyi yo'q. @MarkRansom kichik SFINAE bu shablonni kerak bo'lmagan narsalarga bog'lab turishdir.
qo'shib qo'ydi muallif rustyx, manba
@Matteo Italia shunga o'xshashmi?
qo'shib qo'ydi muallif rustyx, manba
@MarkRansom, Orqaga qaytarish turi bu juda yuklangan ravshanlikda ishtirok etsa, (faqatgina v.find (x)! = V.end() berilganlar uchun tegishli bo'lsa) . Shu tarzda, contains boshqa ortiqcha yuklarni tajovuzkor ravishda egallamaydi.
qo'shib qo'ydi muallif chris, manba
@bolov testlari muvaffaqiyatga erishish degani emas.
qo'shib qo'ydi muallif Yakk - Adam Nevraumont, manba
-1, chunki bu aslida mavjud usuli mavjudligi bilan to'g'ridan-to'g'ri zid keladi, u faqat ahmoqona tarzda berilgan.
qo'shib qo'ydi muallif Matteo Italia, manba
@RustyX: pastga tushirildi, lekin men bu javobni o'chirib tashlayman; find ni taqdim etadigan barcha konteynerlarda count o'rnatilgan bo'lsa, bu o'z ichiga oladi funktsiyasi asosan kerak emas.
qo'shib qo'ydi muallif Matteo Italia, manba
"STL minimal interfeysni taklif qilmoqda" chough std :: string yo'tal
qo'shib qo'ydi muallif bolov, manba
@bolov: sizning fikringiz? std. :: string STL ning bir qismi emas! U standart kutubxonaning bir qismidir va retroactively templated ...
qo'shib qo'ydi muallif MFH, manba

to'siq ning haqiqiy sababi men uchun sir bo'lib qolsa-da, map da bir xil dizayn uchun mumkin bo'lgan tushuntirishlar odamlarni noto'g'ri kod yozishdan iborat bo'lishi mumkin:

if (myMap.contains("Meaning of universe"))
{
    myMap["Meaning of universe"] = 42;
}

Qaysi ikkita xarita </​​code> qo'ng'iroqlariga olib keladi.

Buning o'rniga, iteratorni olishga majbur bo'ldingiz. Bu sizga iteratorni qayta ishlatishingiz kerakligi haqida aql bovar qilmaydi.

auto position = myMap.find("Meaning of universe");
if (position != myMap.cend())
{
    position->second = 42;
}

bu faqat map qidirishni sarflaydi.

Agar to'siq va map bir xil go'shtdan yaratilganligini bilsak, ushbu tamoyilni set ga ham qo'llaymiz. Ya'ni, agar to'siq da mavjud bo'lsa, to'siq da biror element ustida ishlashni istasak, ushbu dizayn quyidagi kodni yozishimiz mumkin emas:

struct Dog
{
    std::string name;
    void bark();
}

operator <(Dog left, Dog right)
{
    return left.name < right.name;
}

std::set dogs;
...
if (dogs.contain("Husky"))
{
    dogs.find("Husky")->bark();
}

Albatta bularning barchasi faqat spekülasyondur.

7
qo'shib qo'ydi
Faqatgina if (myMap.count ("koinotning ma'nosi")) faqat yaxshi yozing, shuning uchun ...?
qo'shib qo'ydi muallif Barry, manba
Ha, lekin bu intsiyalar to'plamlari uchun amal qilmaydi.
qo'shib qo'ydi muallif Jabberwocky, manba
@MichaelWalz Oops, siz haqsiz. Shuningdek, belgilangan misolni o'z ichiga olgan javobni o'zgartirdim. Biroq, intsiyalar to'plamining sababi men uchun sirdir.
qo'shib qo'ydi muallif Martin Drozdik, manba
Bu to'g'ri bo'lmaydi. count bilan o'z ichiga olgan bilan samarali bo'lmagan kodni osongina yozishingiz mumkin.
qo'shib qo'ydi muallif Martin Bonner, manba

Buning yana bir sababi shundaki, dasturchiga std :: to'siq matematikada nazariya nazariyasida to'siq bo'lgan noto'g'ri taassurot beradi. Agar buni amalga oshirsalar, unda ko'plab boshqa savollar bo'ladi: Agar std :: setida() qiymati bo'lsa, unda nima uchun uni boshqa naushnik uchun emas? Birlik (), kesishma() va boshqa o'rnatiladigan operatsiyalar va predilatsizlar qaerda?

Javob, albatta, ba'zi bir operatsiyalar (std :: set_union() va hokazo.) Funktsiyalari sifatida allaqachon amalga oshirilganligi va boshqalar o'z ichiga (kabi) o'z ichiga oladi. Vazifalar va funktsiya moslamalari ob'ekt a'zolariga nisbatan matematik abstractions bilan yaxshi ishlaydi va ular muayyan konteyner turiga cheklanmaydi.

If one need to implement a full math-set functionality, he has not only a choice of underlying container, but also he has a choice of implementation details, e.g., would his theory_union() function work with immutable objects, better suited for functional programming, or would it modify its operands and save memory? Would it be implemented as function object from the start or it'd be better to implement is a C-function, and use std::function<> if needed?

Hozirda bo'lgani kabi, std :: to'siq matematik ma'noda to'siqlarni bajarish uchun juda mos bo'lgan konteyner bo'lib, nazariy vektor sifatida std :: vektor sifatida nazariy jihatdan deyarli mavjud emas.

1
qo'shib qo'ydi