В основном для каждой строки, сравните ее со следующей строкой, чтобы увидеть, короче ли следующая строка или не совпадает ли подстрока следующей строки с текущей строкой.Если это правда, строка уникальна.Это может быть сделано с одним линейным проходом, потому что список отсортирован: любая запись, которая содержит подстроку записи, будет следовать за этой записью.
Неалгоритмическая оптимизация (микрооптимизация) состоит в том, чтобы избежать использованияsubstr, который создает новую строку.Мы можем просто сравнить другую строку, как если бы она была усечена без фактического создания усеченной строки.
vector<string> unique_lines;
for (unsigned int j=0; j < lines.size() - 2; ++j)
{
const string& line = lines[j];
const string& next_line = lines[j + 1];
// If the line is not a substring of the next line,
// add it to the list of unique lines.
if (line.size() >= next_line.size() ||
line != next_line.substr(0, line .size()))
unique_lines.push_back(line);
}
// The last line is guaranteed to not be a substring of any
// previous line as the lines are sorted.
unique_lines.push_back(lines.back());
// The desired output will be contained in 'unique_lines'.