CSet++
Set of defined functions to work with sets
Loading...
Searching...
No Matches
set.h
Go to the documentation of this file.
1
56#include <algorithm>
57#include <vector>
58#pragma once
64namespace set {
65
74 template <typename T> inline bool contains(const std::vector<T>& k, const T& kk) noexcept; //Set contains
75
83 template <typename T> inline int count(const std::vector<T>& k, const T& kk) noexcept; //Set count
84
92 template <typename T> inline std::vector<T>& unique(std::vector<T>& c, const std::vector<T>& k); //Set unique
93
100 template <typename T> inline std::vector<T>& unique(std::vector<T>& k); //Set overloaded unique
101
108 template <typename T> inline std::vector<T> unique(std::vector<T>&& k); //Set overloaded rvalue unique
109
117 template <typename T> inline std::vector<T>& sort(std::vector<T>& c, const std::vector<T>& k); //Set sort
118
125 template <typename T> inline std::vector<T>& sort(std::vector<T>& k); //Set overloaded sort
126
133 template <typename T> inline std::vector<T> sort(std::vector<T>&& k); //Set overloaded rvalue sort
134
142 template <typename T> inline std::vector<T>& rsort(std::vector<T>& c, const std::vector<T>& k); //Set reverse sort
143
150 template <typename T> inline std::vector<T>& rsort(std::vector<T>& k); //Set overloaded reverse sort
151
158 template <typename T> inline std::vector<T> rsort(std::vector<T>&& k); //Set overloaded rvalue reverse sort
159
167 template <typename T> inline std::vector<T>& reverse(std::vector<T>& c, const std::vector<T>& k); //Set reverse
168
175 template <typename T> inline std::vector<T>& reverse(std::vector<T>& k); //Set overloaded reverse
176
183 template <typename T> inline std::vector<T> reverse(std::vector<T>&& k); //Set overloaded rvalue reverse
184
193 template <typename T> inline std::vector<T>& sunion(std::vector<T>& c, const std::vector<T>& k, const std::vector<T>& kk); //Set theory: Union
194
202 template <typename T> inline std::vector<T> sunion(const std::vector<T>& k, const std::vector<T>& kk); //Set theory: Overloaded Union
203
211 template <typename T> inline std::vector<T> sunion(std::vector<T>&& k, const std::vector<T>&& kk); //Set theory: Overloaded Rvalue Union
212
221 template <typename T> inline std::vector<T>& intersection(std::vector<T>& c, const std::vector<T>& k, const std::vector<T>& kk); //Set theory: Intersection
222
230 template <typename T> inline std::vector<T> intersection(const std::vector<T>& k, const std::vector<T>& kk); //Set theory: Overloaded Intersection
231
239 template <typename T> inline std::vector<T> intersection(std::vector<T>&& k, const std::vector<T>&& kk); //Set theory: Overloaded Rvalue Intersection
240
249 template <typename T> inline std::vector<T>& diff(std::vector<T>& c, const std::vector<T>& k, const std::vector<T>& kk); //Set theory: Difference
250
258 template <typename T> inline std::vector<T> diff(const std::vector<T>& k, const std::vector<T>& kk); //Set theory: Overloaded Difference
259
267 template <typename T> inline std::vector<T> diff(std::vector<T>&& k, const std::vector<T>&& kk); //Set theory: Overloaded Rvalue Difference
268
277 template <typename T> inline std::vector<T>& sdiff(std::vector<T>& c, const std::vector<T>& k, const std::vector<T>& kk); //Set theory: Symmetric difference
278
286 template <typename T> inline std::vector<T> sdiff(const std::vector<T>& k, const std::vector<T>& kk); //Set theory: Overloaded Symmetric difference
287
295 template <typename T> inline std::vector<T> sdiff(std::vector<T>&& k, const std::vector<T>&& kk); //Set theory: Overloaded Rvalue Symmetric difference
296}
297
298//Set contains
299template <typename T>
300inline bool set::contains(const std::vector<T>& k, const T& kk) noexcept {
301 for (const T& v: k) {if(v == kk) {return true;}}
302 return false;
303};
304
305//Set count
306template <typename T>
307inline int set::count(const std::vector<T>& k, const T& kk) noexcept {
308 int c = 0;
309 for (const T& v: k) {if(v == kk) {c++;}}
310 return c;
311};
312
313//Set unique
314template <typename T>
315inline std::vector<T>& set::unique(std::vector<T>& c, const std::vector<T>& k) {
316 for (const T& v: k) {if(!set::contains(c, v)) {c.push_back(v);}}
317 return c;
318};
319
320//Set overloaded unique
321template <typename T>
322inline std::vector<T>& set::unique(std::vector<T>& k) {
323 std::vector<T> t;
324 set::unique(t, k);
325 k = std::move(t);
326 return k;
327};
328
329//Set overloaded rvalue unique
330template <typename T>
331inline std::vector<T> set::unique(std::vector<T>&& k) {
332 std::vector<T> t;
333 set::unique(t, k);
334 return t;
335};
336
337//Set sort
338template <typename T>
339inline std::vector<T>& set::sort(std::vector<T>& c, const std::vector<T>& k) {
340 c = k;
341 std::sort(c.begin(), c.end());
342 return c;
343}
344
345//Set overloaded sort
346template <typename T>
347inline std::vector<T>& set::sort(std::vector<T>& k) {
348 std::sort(k.begin(), k.end());
349 return k;
350}
351
352//Set overloaded rvalue sort
353template <typename T>
354inline std::vector<T> set::sort(std::vector<T>&& k) {
355 std::sort(k.begin(), k.end());
356 return k;
357}
358
359//Set reverse sort
360template <typename T>
361inline std::vector<T>& set::rsort(std::vector<T>& c, const std::vector<T>& k) {
362 c = k;
363 std::sort(c.begin(), c.end(), std::greater<T>());
364 return c;
365}
366
367//Set overloaded reverse sort
368template <typename T>
369inline std::vector<T>& set::rsort(std::vector<T>& k) {
370 std::sort(k.begin(), k.end(), std::greater<T>());
371 return k;
372}
373
374//Set overloaded rvalue everse sort
375template <typename T>
376inline std::vector<T> set::rsort(std::vector<T>&& k) {
377 std::sort(k.begin(), k.end(), std::greater<T>());
378 return k;
379}
380
381//Set reverse
382template <typename T>
383inline std::vector<T>& set::reverse(std::vector<T>& c, const std::vector<T>& k) {
384 c = k;
385 for (unsigned int i = 0; i < (k.size() / 2); i++) {std::swap(c[i], c[c.size() - i - 1]);}
386 return c;
387};
388
389//Set overloaded reverse
390template <typename T>
391inline std::vector<T>& set::reverse(std::vector<T>& k) {
392 for (unsigned int i = 0; i < (k.size() / 2); i++) {std::swap(k[i], k[k.size() - i - 1]);}
393 return k;
394};
395
396//Set overloaded rvalue reverse
397template <typename T>
398inline std::vector<T> set::reverse(std::vector<T>&& k) {
399 for (unsigned int i = 0; i < (k.size() / 2); i++) {std::swap(k[i], k[k.size() - i - 1]);}
400 return k;
401};
402
403//Set theory: Union
404template <typename T>
405inline std::vector<T>& set::sunion(std::vector<T>& c, const std::vector<T>& k, const std::vector<T>& kk) {
406 for (const T& v: k) {if(!set::contains(c, v)) {c.push_back(v);}}
407 for (const T& vv: kk) {if(!set::contains(c, vv)) {c.push_back(vv);}}
408 return c;
409};
410
411//Set theory: Overloaded Union
412template <typename T>
413inline std::vector<T> set::sunion(const std::vector<T>& k, const std::vector<T>& kk) {
414 std::vector<T> r;
415 set::sunion(r, k, kk);
416 return r;
417};
418
419//Set theory: Overloaded Rvalue Union
420template <typename T>
421inline std::vector<T> set::sunion(std::vector<T>&& k, std::vector<T>&& kk) {
422 std::vector<T> r;
423 set::sunion(r, k, kk);
424 return r;
425};
426
427//Set theory: Intersection
428template <typename T>
429inline std::vector<T>& set::intersection(std::vector<T>& c, const std::vector<T>& k, const std::vector<T>& kk) {
430 for (const T& v: k) {if((!set::contains(c, v)) && (set::contains(kk, v))) {c.push_back(v);}}
431 for (const T& vv: kk) {if((!set::contains(c, vv)) && (set::contains(k, vv))) {c.push_back(vv);}}
432 return c;
433};
434
435//Set theory: Overloaded Intersection
436template <typename T>
437inline std::vector<T> set::intersection(const std::vector<T>& k, const std::vector<T>& kk) {
438 std::vector<T> r;
439 set::intersection(r, k, kk);
440 return r;
441};
442
443//Set theory: Overloaded Rvalue Intersection
444template <typename T>
445inline std::vector<T> set::intersection(std::vector<T>&& k, std::vector<T>&& kk) {
446 std::vector<T> r;
447 set::intersection(r, k, kk);
448 return r;
449};
450
451//Set theory: Difference
452template <typename T>
453inline std::vector<T>& set::diff(std::vector<T>& c, const std::vector<T>& k, const std::vector<T>& kk) {
454 for (const T& v: k) {if(!contains(kk, v)) {c.push_back(v);}}
455 return c;
456};
457
458//Set theory: Overloaded Difference
459template <typename T>
460inline std::vector<T> set::diff(const std::vector<T>& k, const std::vector<T>& kk) {
461 std::vector<T> r;
462 set::diff(r, k, kk);
463 return r;
464};
465
466//Set theory: Overloaded Rvalue Difference
467template <typename T>
468inline std::vector<T> set::diff(std::vector<T>&& k, std::vector<T>&& kk) {
469 std::vector<T> r;
470 set::diff(r, k, kk);
471 return r;
472};
473
474//Set theory: Symmetric difference
475template <typename T>
476inline std::vector<T>& set::sdiff(std::vector<T>& c, const std::vector<T>& k, const std::vector<T>& kk) {
477 set::diff(c, k, kk);
478 set::diff(c, kk, k);
479 return c;
480};
481
482//Set theory: Overloaded Symmetric difference
483template <typename T>
484inline std::vector<T> set::sdiff(const std::vector<T>& k, const std::vector<T>& kk) {
485 std::vector<T> r;
486 set::sdiff(r, k, kk);
487 return r;
488};
489
490//Set theory: Overloaded Rvalue Symmetric difference
491template <typename T>
492inline std::vector<T> set::sdiff(std::vector<T>&& k, std::vector<T>&& kk) {
493 std::vector<T> r;
494 set::sdiff(r, k, kk);
495 return r;
496};
Contains all the functions for performing set operations on std::vector.
std::vector< T > & diff(std::vector< T > &c, const std::vector< T > &k, const std::vector< T > &kk)
Obtains the set theory difference of two sets.
Definition: set.h:453
bool contains(const std::vector< T > &k, const T &kk) noexcept
Checks if an element is present in the set.
Definition: set.h:300
std::vector< T > & sdiff(std::vector< T > &c, const std::vector< T > &k, const std::vector< T > &kk)
Obtains the set theory symmetric difference of two sets.
Definition: set.h:476
std::vector< T > & intersection(std::vector< T > &c, const std::vector< T > &k, const std::vector< T > &kk)
Obtains the set theory intersection of two sets.
Definition: set.h:429
std::vector< T > & rsort(std::vector< T > &c, const std::vector< T > &k)
Sorts a set in descending order.
Definition: set.h:361
int count(const std::vector< T > &k, const T &kk) noexcept
Counts the number of times an element is present in the set.
Definition: set.h:307
std::vector< T > & unique(std::vector< T > &c, const std::vector< T > &k)
Removes duplicates from a set.
Definition: set.h:315
std::vector< T > & sort(std::vector< T > &c, const std::vector< T > &k)
Sorts a set in ascending order.
Definition: set.h:339
std::vector< T > & reverse(std::vector< T > &c, const std::vector< T > &k)
Reverses the passed set.
Definition: set.h:383
std::vector< T > & sunion(std::vector< T > &c, const std::vector< T > &k, const std::vector< T > &kk)
Obtains the set theory union of two sets.
Definition: set.h:405