I would avoid the testing for calling Begin and End appropriately by creating a separate class that does the begin actions during construction and the end actions during destruction.
As for speeding up the code, I think the first real step is to clarify the code a bit so it's easier to see what's really going on and what's needed. Just for example, you have:
for( int i = count + 1; i < sprites.size(); i++ )
{
if( sprites[count].texture == sprites[i].texture )
{
drawCount++;
}
else
{
break;
}
}
It looks like this could be rewritten to use std::find_if instead, and end up quite a bit simpler and more readable:
if (sprites.end() != std::find_if(sprites.begin()+count=1, sprites.end(),
[](sprite const &a, sprite const &b) { return a.texture == b.texture; }))
++drawCount;
The obvious next step to take would be to avoid the linear search for the texture for every sprite. You haven't shown enough of the rest of the system to see an obvious way to do that, but chances seem pretty decent that you can probably avoid it.