Changed ip initialization to happen in a for loop, changed the for loop to initialize every element of the array rather than ignoring the last one
Changed back to std::copy. std::copy, interestingly enough, doesn't like 2D arrays. I made it deal exclusively with memory addresses, which is compiling. No clue if it's working as expected or not, but it compiles and runs without error