Waterfall style development (non-iterative) is appropriate for well defined problems, where there are few unknowns. Here it makes sense to do the majority of the planning up front, since it'll let you consider the design in its entirety. The iteration here comes in the planning phase. Programming languages and text editors are good examples of this - most surprises should be caught in the design phase.
In contrast, where iterative development shines is where there's an external feedback loop somewhere - this is the user discovery that you're referring to. If you don't know what the customers really want, build something, give it to them, and get feedback. The risk to iterative development though is that it's gradient descent - it ends up converging to a local optimum but won't get you to a global one.
Of course, very little development is purely iterative or purely waterfall, but rather it's a spectrum. Programming languages and text editors have version 1.1, 1.2, etc., after all. One of my annoyances with iterative development is that it's often used as an excuse not to plan - so people end up walking into problems that easily could have been known upfront, and ultimately spend more time building a worse solution. Imagine building a house - that the house needs plumbing should be something the architect realizes upfront, not something that should be discovered half way through.