У меня есть 2D вектор, как определено ниже классами. Обратите внимание, что я использовал классы, потому что я пытаюсь запрограммировать генетический алгоритм так, чтобы было создано много, много 2D векторов, и все они будут разными.
class Quad: public std::vector<int>
{
public:
Quad() : std::vector<int>(4,0) {}
};
class QuadVec : public std::vector<Quad>
{
};
Важная часть моего алгоритма, однако, заключается в том, что мне нужно иметь возможность «мутировать» (произвольно изменять) конкретные значения в определенном количестве случайно выбранных 2D векторов. Это поставило меня в тупик. Я могу легко написать код для случайного выбора значения в 2D-векторе, которое будет выбрано для «мутации», но как мне на самом деле осуществить это изменение с помощью классов? Я понимаю, как это можно сделать с одним 2D-вектором, который уже был инициализирован, но как мне это сделать, если это не так?
Пожалуйста, дайте мне знать, если я не предоставил достаточно информации или мне не ясно, как я это делаю.
Спасибо за ваше время и помощь!
Как уже отмечалось в комментариях, наследование от 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;
Других решений пока нет …