operator<
ищется через ADL. Нельзя определить оператор для чужих типов, и чтобы его подхватили алгоритмы. Предлагаю такое решение: вместо char искать свою структуру (её можно определить просто как struct с char), для которой определить сравнение так же, как ты это сделал с char. std::any
позволяет сохранить в себя объект любого типа, после чего через any_cast
вытащить значение, если оно такого типа, как мы предполагаем. Проверка осуществляется через RTTI. Если поддерживается много конкретных типов, вы должны писать здоровенную цепочку if-else-if. В таком случае лучше уж идти через наследование. namespace what {
#define apples 2
}
namespace stuff {
class foo {
private:
int apples = 3; // ОШИБКА: 2 - недопустимое имя
public:
int read_apples() {
return apples; // 2
}
};
}
constexpr
константами или inline
функциями. А там, где они необходимы, давайте им длинные страшные КРИЧАЩИЕ_ИМЕНА. std::vector<std::vector<std::string>>
. Каждый внутренний вектор хранит варианты выбора для очередного куска строки. В частности, для кусков строки между вариативными частями будем считать, что есть всего 1 вариант выбора. Соответственно, весь вектор векторов — это последовательность таких вариативных частей. Задача делится на 2 части:std::string
для текущего варианта и std::vector<std::string>
для текущей вариативной части.std::string
, и накидываем туда из каждого внутреннего вектора по 1 варианту. Cls::Cls(char c, double d, int i)
: c(c), d(d), i(i) {}
std::string
использует SBO, то есть не выделяет доп. память в куче для коротких строк. Ещё стандартные мапы в C++ крайне неэффективны, подключите библиотеку. Идея такова:IdentifyLength,
а не на typedef
. К слову, в новом коде вместо typedef
следует использовать using
:using DigitArea = unsigned int;
<cstdint>
по умолчанию. Например:using DigitArea = std::int64_t;
#include "std_lib_facilities.h"
std_lib_facilities.h
и подключили его должным образом? template <typename T>
class hashed {
T value_;
size_t hash_;
friend class std::hash<hashed<T>>;
public:
template <typename... Args>
constexpr hashed(Args&&... args) :
value_(std::forward<Args>(args)...),
hash_(std::hash<T>()(value_))
{}
// rule of zero
constexpr T& get() & noexcept { return value_; }
constexpr const T& get() const& noexcept { return value_; }
constexpr T&& get() && noexcept { return value_; }
constexpr const T&& get() const&& noexcept { return value_; }
};
namespace std {
template <typename T>
struct hash<hashed<T>> {
constexpr size_t operator()(const hashed<T>& x) const noexcept {
return x.hash_;
}
};
}
std::unordered_map<hashed<std::string>, int> cache;
auto it = cache.find("property1"); // хеш на этапе выполнения
// хеш на этапе компиляции, работает с constexpr std::string из C++20
constexpr auto h = hashed<std::string>("property1");
auto it2 = cache.find(h); // предрасчитанный хеш
enum Foo {
case qqq(Int)
case www(Int)
}
let x = Foo.qqq(5)
let y = Foo.www(10)
class Foo {
public:
virtual ~Foo() = 0;
};
class qqq : public Foo {
public:
int value;
explicit qqq(int value);
};
class www : public Foo {
public:
int value;
explicit www(int value);
};
using FooPtr = std::unique_ptr<Foo>;
FooPtr makeQqq(int value);
FooPtr makeWww(int value);
FooPtr x = makeQqq(5);
FooPtr y = makeWww(10);
type_safe
(кликабельно).#include <type_safe/strong_typedef.hpp>
#include <type_safe/variant.hpp>
namespace ts = type_safe;
using qqq = ts::strong_typedef<int>;
using www = ts::strong_typedef<int>;
using Foo = ts::variant<qqq, www>;
// ...
auto x = Foo(qqq(5));
auto y = Foo(www(10));
if (x.has_value(ts::variant_type<qqq>{})) {
qqq value = x.value(ts::variant_type<qqq>{}));
std::cout << "qqq" << ' ' << static_cast<int>(value);
}
fmt::print("Total: [{}]\n", fmt::join(total_1.begin(), total_1.end(), ", "));
//=> Total: [1, 2, 3]
Может, кто-то ещё переметнётся на сторону printf-стиля :] <random>
:// Важно: создание этого объекта занимает некоторое время,
// его лучше использовать для генерации всех случайный чисел
std::default_random_engine engine(std::random_device()());
// Легковесный объект-диапазон для генерации целых чисел
// В std есть и куча других полезных распределений
std::uniform_int_distribution<int> distribution(min,max);
for (int i = 0; i < N; ++i) {
int random_number = distrubution(engine);
std::cout << random_number << std::endl;
}
std::list
из хедеров VS2003 в свой хедер my_list.h
std::list
в класс (не std) my_list
my_list
вместо std::list
при работе с библиотекойstd::list&
, то при вызове функции можно передавать reinterpret_cast<std::list&>(my_list_instance)
, чтобы пропихнуть тот список,#include <math.h>
, в C++ нужно использовать #include <cmath>
. Она более производительна в некоторых случаях, и там есть больше функций для C++.int
, если всё равно вычисляем double
? Тогда программа не сойдёт с ума при больших координатах.x*x
можно использовать pow(x,2)
без потери производительности.#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
double x1, x2, y1, y2;
cin >> x1 >> x2 >> y1 >> y2;
cout << fixed << setprecision(2) << sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
return 0;
}