https://codepen.io/Tanded/pen/OqVBPE
function fnc(el){
el.classList.toggle("clicked");
}
добавить небольшую функцию js для переключения класса и редактирования css в анимационных строках, когда они щелкнули по классу вместо hover &: hover -> & amp;. щелкнул по строке 53
Если у вас нет для использования векторов, вы можете попробовать Boost.Multi_array . Вот ссылка на короткий пример.
Как указал Ари, vector
- правильный способ сделать это.
В дополнение к этому, в таких случаях я всегда рассматриваю обертывание внутреннего вектора (фактически, независимо от того, это представляет) в классе, потому что сложные структуры STL имеют тенденцию становиться неуклюжими и запутывающими.
vector
Если вы хотите определить строки и столбцы,
vector
std::vector< std::vector< int > > a; // as Ari pointed
Использование этого для растущей матрицы может оказаться сложным, поскольку система не гарантирует, что все внутренние векторы имеют одинаковый размер. Всякий раз, когда вы растете во втором измерении, вам придется явно увеличивать все векторы.
// grow twice in the first dimension
a.push_back( vector<int>() );
a.push_back( vector<int>() );
a[0].push_back( 5 ); // a[0].size() == 1, a[1].size()==0
Если вас это устраивает (на самом деле это не матрица, а вектор векторов), все должно быть в порядке. В противном случае вам нужно будет проявить особую осторожность, чтобы второе измерение было стабильным для всех векторов.
Если вы планируете использовать матрицу фиксированного размера, вам следует рассмотреть возможность инкапсуляции в класс и переопределения оператора () вместо предоставления двойного синтаксис массива. Прочтите часто задаваемые вопросы по C ++ по этому здесь
std::vector< std::vector<int> > a;
//m * n is the size of the matrix
int m = 2, n = 4;
//Grow rows by m
a.resize(m);
for(int i = 0 ; i < m ; ++i)
{
//Grow Columns by n
a[i].resize(n);
}
//Now you have matrix m*n with default values
//you can use the Matrix, now
a[1][0]=98;
a[1][1]=989;
a[1][2]=981;
a[1][3]=987;
//OR
for(i = 0 ; i < m ; ++i)
{
for(int j = 0 ; j < n ; ++j)
{ //modify matrix
int x = a[i][j];
}
}
Предложение dribeas - это действительно правильный путь.
Чтобы указать причину, по которой вы можете захотеть пойти по маршруту operator (), учтите, что, например, если ваши данные являются разреженными, вы может расположить его по-другому, чтобы сэкономить внутреннее пространство, а operator () скрывает эту внутреннюю проблему реализации от конечного пользователя, обеспечивая лучшую инкапсуляцию и позволяя освободить место или ускорить внесение изменений во внутреннюю компоновку позже, не нарушая ваш интерфейс.