std::vector<std::pair<int, char>>
, а в std::sort
передавать собственный компаратор, который будет сравнивать только первые элементы:vector<pair<int, char>> vec;
sort(vec.begin(), vec.end(), [](pair<int, char> a, pair<int, char> b){return a.first < b.first;});
// Следующая строка при компиляции будет заменена на содержимое файла helloworld.h
#include "helloworld.h"
int main(int argc, char** argv)
{
helloworld(); // Вызываем функцию определённую в другом файле.
return 0;
}
// Следующая конструкция называется include guard.
// Благодаря ней вы не сможете вставить содержимое этого файла дважды,
// что поможет вам избежать ошибок переопределения.
#ifndef HELLOWORLD_H
#define HELLOWORLD_H
// Объявление функции.
// Если функция объявлена но не определена в данном файле,
// компилятор будет искать её реализацию в других файлах.
void helloworld();
#endif
// Снова вставляем содержимое файла helloworld.h
#include "helloworld.h"
#include <iostream>
// Определяем функцию.
void helloworld()
{
std::cout << "Hello, world!";
}
gcc file_name.cpp -lstdc++
msvc++
и g++
делают это автоматически. Наверняка как-то это уже реализованно/упрощено с помощью стл или буст или чего-то еще.
class DecimalFixedPoint
{
public:
static const int denominator = 100; // Affect on precison
friend std::ostream& operator<<(std::ostream& stdout, DecimalFixedPoint dfp);
DecimalFixedPoint() : numerator(0) {}
DecimalFixedPoint(int i, bool) : numerator(i) {}
DecimalFixedPoint(int i) : numerator(i * denominator) {}
explicit DecimalFixedPoint(float f) : numerator(f * denominator) {}
explicit DecimalFixedPoint(double d) : numerator(d * denominator) {}
DecimalFixedPoint operator+(const DecimalFixedPoint& right)
{
return DecimalFixedPoint(numerator + right.numerator, true);
}
DecimalFixedPoint operator-(const DecimalFixedPoint& right)
{
return DecimalFixedPoint(numerator - right.numerator, true);
}
DecimalFixedPoint operator*(const DecimalFixedPoint& right)
{
return DecimalFixedPoint(numerator * right.numerator / denominator, true);
}
DecimalFixedPoint operator/(const DecimalFixedPoint& right)
{
return DecimalFixedPoint(numerator * denominator / right.numerator, true);
}
private:
int numerator;
};
std::ostream& operator<<(std::ostream& stdout, DecimalFixedPoint dfp)
{
stdout << dfp.numerator / DecimalFixedPoint::denominator
<< '.'
<< dfp.numerator % DecimalFixedPoint::denominator;
return stdout;
}
DecimalFixedPoint(int i, bool) : numerator(i) {}
второй параметр нужен для того, чтоб сигнатура отличалась от конструктора DecimalFixedPoint(int i) : numerator(i * denominator) {}
Если вызывается конструктор с параметром bool
, подразумевается, что мы не приводим целое число к нашему типу, а передаём заранее вычисленный числитель нашей дроби. Это, конечно, костыль, но так как такой подход используется в самом стандарте C++ (перегрузка префиксных и постфиксных инкремента/декремента), то совесть моя чиста. int gcd(int a, int b) {
int c;
while (b) {
c = a % b;
a = b;
b = c;
}
return abs(a);
}
int a = 16;
int b = 4;
gcd(a, b);
cout << a << ' ' << b; // Выведет "16 4", а не "4 0"
template<T> struct LinkedListItem
{
T value;
LinkedListItem* next;
};
#include <iostream>
float f1(float x)
{
return 2 * x + 6;
}
float f2(float x)
{
return -3 * x * x + 8 * x - 6;
}
void printTable(float(*f)(float), float beg=0.f, float end=10.f, float step = 1.f)
{
for(float x = beg; x <= end; x += step)
{
std::cout << "x = " << x << "\ty = " << f(x) << '\n';
}
}
int main(int argc, char** argv)
{
printTable(f1);
printTable(f2);
}
cout << static_cast<char>(7);
#define MSG_ADD_OBJECT 0
#define MSG_REMOVE_OBJECT 1
int64 a = MSG_ADD_OBJECT; // a = 0
int64 b = MSG_REMOVE_OBJECT; // b = 1
enum MSG {ADD_OBJECT, REMOVE_OBJECT};
// Можно использовать два варианта:
int64 a = ADD_OBJECT; // a = 0
int64 b = MSG::REMOVE_OBJECT; // b = 1
for (int i = 0; getline(in, line); i++) {
matrix.push_back(vector<int>()); // добавляем новую строку
for (int j = 0; j < line.size(); j++) {
matrix[i].push_back(line[j]); // в данную строку добавляем элементы.
}
};
vector<vector<char>>
а не vector<vector<int>>
.int num;
for (int i = 0; getline(in, line); i++) {
stringstream ss(line);
matrix.push_back(vector<int>()); // добавляем новую строку
while(ss >> num) {
matrix[i].push_back(num); // в данную строку добавляем элементы.
}
};
int plus(int a, int b) {return a + b;}
float plus(float a, float b) {return a + b;}
double plus(double a, double b) {return a + b;}
unsigned long long plus(unsigned long long a, unsigned long long b) {return a + b;}
// выбьет ошибку для любого другого типа, кроме int, float, double, unsigned long long
template<typename T>
T plus(T a, T b) {return a + b;}
// Работает для любых типов, которые определяют opeator+