В C ++ следующая процедура будет производить все комбинации расстояния длины (сначала k) между диапазоном [первым, последним]:
#include <algorithm>
template <typename Iterator>
bool next_combination(const Iterator first, Iterator k, const Iterator last)
{
/* Credits: Mark Nelson http://marknelson.us */
if ((first == last) || (first == k) || (last == k))
return false;
Iterator i1 = first;
Iterator i2 = last;
++i1;
if (last == i1)
return false;
i1 = last;
--i1;
i1 = k;
--i2;
while (first != i1)
{
if (*--i1 < *i2)
{
Iterator j = k;
while (!(*i1 < *j)) ++j;
std::iter_swap(i1,j);
++i1;
++j;
i2 = k;
std::rotate(i1,j,last);
while (last != j)
{
++j;
++i2;
}
std::rotate(k,i2,last);
return true;
}
}
std::rotate(first,k,last);
return false;
}
Его можно использовать следующим образом:
#include <string>
#include <iostream>
int main()
{
std::string s = "12345";
std::size_t comb_size = 3;
do
{
std::cout << std::string(s.begin(), s.begin() + comb_size) << std::endl;
} while (next_combination(s.begin(), s.begin() + comb_size, s.end()));
return 0;
}
Это напечатает следующее:
123
124
125
134
135
145
234
235
245
345
Спонтанно я должен сказать, что единственное решение, которое я могу придумать, - это, к сожалению, используя JavaScript. Что-то вроде:
<script type="text/javascript">
if (document.location.hash == "" || document.location.hash == "#")
document.location.hash = "#updates-list";
</script>
РЕДАКТИРОВАТЬ:
Хорошо, есть решение CSS. Однако для этого требуется, чтобы запись по умолчанию # updates-list
была помещена последней (после # updates-map
и любых других вкладок, которые вы можете добавить):
.tab, .tab:target ~ #updates-list {
display: none;
}
#updates-list, .tab:target {
display: block;
}
Думаю, вам нужно выбрать что-то вроде .tab_container: not (>: target)> .default
, чтобы отобразить вкладку по умолчанию, когда никто не нацелен . Однако это невозможно, поскольку псевдокласс : not ()
принимает только простые селекторы (т.е. только : target
, а не >: target
, в котором если вы проверяете цель контейнера, а не дочерние элементы).
Я бы сделал одно из следующих действий:
Используйте Javascript, чтобы установить цель на первую вкладку при загрузке (или просто потребуйте, чтобы якорь присутствовал).
Добавьте определенный класс переопределения для первой активной вкладки и удалите его (снова с помощью Javascript) после первого переключения вкладки.
Первая альтернатива приведет к путанице с историей браузера, а вторая - немного больше к беспорядку кода. Я не могу сейчас придумать "идеального" решения. Может быть, вам лучше просто использовать Javascript в целом для обнаружения текущей цели, чтобы обеспечить совместимость с браузерами, отличными от CSS3, и решить эту конкретную проблему более понятным способом?