Q:

unique() seems to be adding another copy of the last element

When I call unique() in this code, the output ends up having a copy of the final element tacked on at the end.
vector<vector<int>> ints;
for(int i(0); i<files; i++)
{
    stringstream stream(list[i]);
    int num(0);
    vector<int> aList;
    for(int j(0); j<list[i].length(); j++)
    {
        if(stream.peek() == ' ')
                stream.ignore();
        while (stream >> num)
        {
            aList.push_back(num);
            if(stream.peek() == ' ')
                stream.ignore();
        }
    }
    ints.push_back(aList);
    unique(ints[i].begin(), ints[i].end());
}

I have a vector of strings (that are actually lists of integers) called list that are being parsed into ints and being stored in a multidimensional vector. unique() is meant to strip the duplicates from the integer vectors that get created.
Anyway, my question is this: How can I get unique() to stop tacking on an extra element?

A:

If you look at the documentation for std::unique, you'll note that it:

Removes all consecutive duplicate elements from the range [first, last) and returns a past-the-end iterator for the new logical end of the range.

Emphasis in the original. The return is only where the end should be - this algorithm doesn't actually erase any elements from the container since it can't know how to do this in the general case.
That's why you need to take the result of unique and pass it into erase. From the example in the documentation:
auto last = std::unique(v.begin(), v.end());
v.erase(last, v.end());

Or for your specific case:
ints[i].erase(
    // new logical end 
    std::unique(ints[i].begin(), ints[i].end()),
    // actual end
    ints[i].end());

Also note that unique only removes consecutive duplicates - not all duplicates. In case you really want trully unique results, you'll need to sort your vector first. 

