If you know that one is always in ascending order, and the other in descending order then it's pretty easy to use forward iterators for one and reverse iterators for the other.
My guess would be that inverted order was only an example of containing the same data, but in a different order, and they both happened to be in ascending order, you'd still want them to compare as equal. And likewise, if both were in random order, but still contained exactly the same elements, you'd want that counted as equal as well.
In this case, you're pretty much stuck with comparing sorted copies of the two inputs. In theory you could step through one, and search for the elements in the other, but that's slow, and requires quite a bit of care to get correct (e.g., unless you're careful, it's easy to end up with an implementation that says [1, 1, 2] is equal to [1, 2, 2]). Worse, even if you get this really correct, you still end up with an O(N2) algorithm, which gets pretty slow in a hurry if you have very many elements.
So, if you really need to support this, the most practical method is probably going to be to create a copy of each input, sort those copies, and then compare the results to each other (though if you can sort the originals, that obviously reduces memory usage).
If you're dealing with large arrays, you might also consider counting the number of times each value occurs using something like an std::unordered_map. This reduces the expected complexity from O(N log N) to O(N), so with enough elements, it should be faster (but exactly how many is enough may be hard to guess, and likely varies between implementations).