I understand it is better to provide the client with a copy rather than return a reference to 'things' (or any element thereof).
However, it seems to me that if the client wants to amend a thing then the only way of doing it is by asking the user to provide a copy of the thing and then a new thing which will replace it. As follows
If "amend a thing" means updating or changing the proper of CustomType, then the user does not have to provide the old_thing. The user just provides a new_thing and you do as follows
1 2 3 4 5
For thing in things,
if(new_thing is present)
change_property
else
tell_user_that_new_thing_is_not_present
making copies of fat things when it isnt necessary is a performance hit.
This is why you can promote things to be constant if you don't want them to change it, can you not provide a const ref instead of a copy?
Since this is a "container" the "container" doesn't need to know anything about the class being "contained".
The container should probably have methods to insert, remove, replace an element in the container, look at the standard containers for examples of what may be needed.