set(CMAKE_PREFIX_PATH "C:\\Qt\\6.1.3\\mingw81_64\\lib\\cmake")
LIMIT = ...
matrix = ...
count = ...
[&]{
for (int i = 0; i < LIMIT; i++) {
for (int j = 0; j < LIMIT; j++){
int value = matrix[i][j];
for (int a = 0; a < LIMIT; a++) {
for (int b = 0; b < LIMIT; b++) {
if (value == matrix[a][b]){
count++;
}
if (count == 2) {
std::cout << "Indexes of elements: " << "[" << i << ", " << j << "], ";
std::cout << "[" << a << ", " << b << "]" << std::endl;
return;
}
}
}
count = 0;
}
}
}();
for( vector<CPetriAction *> :: iterator i = m_Messages.begin(); i != m_Messages.end(); )
{
delete *i;
m_Messages.erase( i );
}
erase
итератор становится невалидным. На практие скорее всего удаляются элементы 0, 2, 4 ... в первой половине вектора, т.к. когда удаляется нулевой элемент - первый становится нулевым, второй первым, и итератор переходит на новый первый элемент, который раньше был вторым. Решается легко:for( vector<CPetriAction *> :: iterator i = m_Messages.begin(); i != m_Messages.end(); )
{
delete *i;
}
//m_Messages.clear(); // - в данном случае смысла нет, т.к. это деструктор
for(auto& ptr: m_Messages){
delete ptr;
}
m_Messages
хранить unique_ptr
- тогда и этого не нужно, объекты удалятся автоматически в деструкторе вектора. MyClass value();
- а это уже объявление функции. Из-за этого пустой список аргументов интерпретироваться как пустой список инициализации, но пустой список инициализации опять же нельзя передать в конструктор без аргументов, используя круглые скобки, т.к. один аргумент всё-таки есть. Но при использовании фигурных скобок список инициализации нормально вызывает конструктор без аргументов. При этом неявное преобразование из пустого списка инициализации в MyClass возможно - неявно вызывается конструктор без аргументов:void foo(MyType2&&){ }
foo({}); // Компилируется
MyClass({})
преобразует {}
во временный объектMyClass
, а его попытается передать в удалённый конструктор перемещения MyClass
#include <iostream>
#include <limits>
int main() {
int num = 0;
while(num != -1) {
std::cout << "Enter the number to push: ";
std::cin >> num;
if(std::cin.fail()){
std::cout << "It is not number" << std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<int>::max(), '\n');
} else{
std::cout << "num = " << num << std::endl;
}
}
return 0;
}
#include <array>
template<std::size_t ColumnCount, std::size_t RowCount >
int foo(int (&matrix)[ColumnCount][RowCount]){
int r = 0;
for(auto& row: matrix){
for(auto& x: row)
r += x;
}
return r;
}
int bar(){
int matrix [][2] = {{1, 2}, {3, 4}, {4, 6}};
return foo(matrix);
}
std::array
, но двумерный C-массив нельзя напрямую привести к std::array<std::array<int, M>, N>
. Но можно изначально работать с std::array
:template<std::size_t ColumnCount, std::size_t RowCount >
int foo(std::array<std::array<int, RowCount>, ColumnCount>& matrix){
int r = 0;
for(auto& row: matrix){
for(auto& x: row)
r += x;
}
return r;
}
int bar(){
std::array<std::array<int, 2>, 3> matrix = {{{1, 2}, {3, 4}, {4, 6}}};
return foo(matrix);
}
w = new QPushButton;
не указан родитель, а значит кнопка создаётся для цикла событий основного потока. Однако QML может работать в своём собственном потоке (с которым связан свой цикл событий), из-за чего кнопка создаётся в потоке QML, но для цикла событий основного потока. Об этом и написано в сообщении об ошибке. Должна помочь передача родителя, работающего в потоке QML: w = new QPushButton(this);
. При этом кнопка будет использовать цикл событий родителя (this уже от своего родителя знает, в каком он потоке). const std::string &getRef() {
std::string tmpObject = "123";
return tmpObject;
}
void foo(){
const std::string& ref = getRef();
std::cout << ref; // Выведет 123
}
std::string getStr() {
std::string tmpObject = "123";
return tmpObject;
}
void foo(){
std::string str = getStr();
std::cout << str; // Выведет 123
}
// На крайний случай можно так - это точно корректно, но лучше не нужно - иначе кто-нибудь
// может случайно удалить const, что приведёт к проблемам.
void bar(){
const std::string& ref = getStr();
std::cout << ref; // Выведет 123
}
static constexpr std::array<callbackType, n>
template<class Rt, class Fn>
Rt static_capture(Fn fn){
static Fn state = std::move(fn);
return []{
state();
};
}
int main() {
int localVar = 5;
setit(static_capture<callbackType>([localVar](int num) {
std::cout << num;
std::cout << localVar;
}));
}
std::function
- в худшем случае она работает в два раза медленнее, чем обычные виртуальные функции. Можно написать свою реализацию специально для лямбд, которая будет работать чуть быстрее за счет меньшей универсальности, но принципиально ситуацию это не меняет - в большинстве случаев это незначительные расходы. Если всё же нужно оптимизировать - нужно менять архитектуру программы, передавать лямбды в качестве шаблонных параметров непосредственно к месту вызова, если это возможно (тогда они инлайнятся), использовать те же виртуальные функции и классические механизмы ООП. make test
или аналогичной для других систем сборки, что скорее всего можно прописать уже в настройках Clion: либо в настройках запуска проекта, либо как внешний инструмент.