Замена двухмерного векторного значения с использованием классов; генетический алгоритм мутации

У меня есть 2D вектор, как определено ниже классами. Обратите внимание, что я использовал классы, потому что я пытаюсь запрограммировать генетический алгоритм так, чтобы было создано много, много 2D векторов, и все они будут разными.

class Quad: public std::vector<int>
{
public:
Quad() : std::vector<int>(4,0) {}
};

class QuadVec : public std::vector<Quad>
{
};

Важная часть моего алгоритма, однако, заключается в том, что мне нужно иметь возможность «мутировать» (произвольно изменять) конкретные значения в определенном количестве случайно выбранных 2D векторов. Это поставило меня в тупик. Я могу легко написать код для случайного выбора значения в 2D-векторе, которое будет выбрано для «мутации», но как мне на самом деле осуществить это изменение с помощью классов? Я понимаю, как это можно сделать с одним 2D-вектором, который уже был инициализирован, но как мне это сделать, если это не так?

Пожалуйста, дайте мне знать, если я не предоставил достаточно информации или мне не ясно, как я это делаю.

Спасибо за ваше время и помощь!

0

Решение

Как уже отмечалось в комментариях, наследование от std::vector считается плохой практикой в ​​C ++, за исключением случаев, когда это необходимо в очень редких случаях (пожалуйста, прочитайте ссылку для более подробной информации). Из вашего вопроса, возможно, вам нужно следующее:

typedef std::vector<std::vector<int>> twodvec; // Create a typedef
twodvec vec1(10, std::vector<int>(4, 0)); // Create twodvec which holds 10 quads
twodvec vec2(20, std::vector<int>(4, 0)); // Create twodvec which holds 20 quads
vec1[0][0] = 1; // Use subscripts to assign values to the preallocated memory
vec2[0][1] = 2;

использование push_back если вы не распределили память. Поскольку ваш класс, кажется, не добавляет никакой дополнительной функциональности, кажется, все, что вам нужно сделать, это что-то похожее на приведенное выше.

Чтобы обновить ответ, показывающий состав:

class QuadVec
{
std::vector<std::vector<int>> twodvec; // private
public:
QuadVec() : twodvec(10, std::vector<int>(4, 0))
{}
int& operator()(std::size_t row, std::size_t col)
{
// checking for out-of-bound indexes would be good to
return twodvec[row][col];
}
};

Затем обновите QuadVec следующим образом:

QuadVec v;
v(0, 0) = 1;
0

Другие решения

Других решений пока нет …