- Есть ли «приятный» способ (т.е. лучший, чем то, что я представил выше) найти смещение элемента в диапазоне?
Нет, не в общий.
Гарантированно ли вышеописанный метод работает для любого типа данных?
Почти (за исключением того, что вам, очевидно, нужно изменить тип аргумента, чтобы он соответствовал любому типу данных, который повторяется). Вам нужно будет использовать std::addressof
, чтобы он работал с типами, которые перегружают оператор addressof (но кто это делает?).
Можно ли что-то подобное реализовать для ассоциативных структур данных?
Не совсем так. То, что вы показали, работает, но только для смежных итераторов, то есть итераторов для массивов (в общем смысле, который включает векторы и строки).
Предполагая, что вы используете алгоритм, который выполняет итерацию элементов по порядку (это где действительно важна политика выполнения), то общее решение - использовать аккумулятор:
auto offset_value_mismatch = [](auto& x) {
static int i;
return i++ == x;
}
Изменится ли какой-либо из ответов, если я использую перегрузки алгоритма, принимающие std :: ExecutionPolicy?
Как вычитание адреса, так и аккумулятор работают только с последовательными алгоритмами, а не с параллельные. Технически аккумулятор можно заставить работать с параллельной политикой (но не неупорядоченной) с использованием блокировок, но, насколько мне известно, в этом нет никакого преимущества.