Template heap/priority-queue data structure with update-key operation
peak() should be returning a const reference. same goes for getItem().
Extract() should not return anything. Having two functions to read the head just begs for someone to accidentally call Extract() when they meant peak().
Why is key forced to be an int? It could easily be a separate template parameter.
heap.push_back(IzHeapItem(keys[i], items[i])); should be heap.emplace_back(keys[i], items[i]); instead.
you should do a heap.reserve() at the top of heapify()
Heapifying a vector&lt;> containing the same item twice would break this pretty badly. You should guard against this.
Unless you intend to call heapify() multiple times in a row, that should just be a constructor. Otherwise, I would rename that function addToHeap()
I prefer to avoid using the [] operator on maps in general unless I specifically want a "insert-or-replace" logic. There's a bunch of logic to handle creating a new instance, which assumes the value type of the map has a default constructor.


so:

itemToHeapIndex[items[i]] = i;


becomes 

itemToHeapIndex.emplace(items[i], i);


and 

assert(itemToHeapIndex.count(item) &gt; 0);
int index = itemToHeapIndex[item];


becomes

auto found = itemToHeapIndex.find(item);
assert(found != itemToHeapIndex.end()); // Bonus! no additional lookup in debug
int index = found-&gt;second;


Super minor detail:

The peak() function name made me squint. Traditionally, peek() means "see the next value that will come out of the datastructure", which is what happens here. This is not really a problem you have to fix, more of an observation. I would personally have used top() and pop() to match established standards.