Оперативный C++ установил пересечение

В.NET (принимающий UTC):

 datetime.ToString("YYYY-MM-DD'T'HH:mm:ssZ")

DateTime.Parse() может использоваться для преобразования назад в DateTime структура.

20
задан ks1322 23 September 2012 в 10:38
поделиться

2 ответа

Я думаю, что понял:

std::set<int>::iterator it1 = set_1.begin();
std::set<int>::iterator it2 = set_2.begin();
while ( (it1 != set_1.end()) && (it2 != set_2.end()) ) {
    if (*it1 < *it2) {
        set_1.erase(it1++);
    } else if (*it2 < *it1) {
        ++it2;
    } else { // *it1 == *it2
            ++it1;
            ++it2;
    }
}
// Anything left in set_1 from here on did not appear in set_2,
// so we remove it.
set_1.erase(it1, set_1.end());

Кто-нибудь видит какие-нибудь проблемы? Кажется, O (n) по размеру двух наборов. Согласно cplusplus.com , std :: set erase (position) является амортизированной константой, а erase (first, last) - O (log n).

12
ответ дан 30 November 2019 в 01:18
поделиться

Вы можете легко пройти через set_1 , проверить каждый элемент, чтобы увидеть, существует ли он в set_2 и сотрите его, если это не так. Поскольку наборы отсортированы, вы можете сравнивать их за линейное время, а стирание элемента с помощью итератора является амортизированным постоянным временем . Я бы не стал рассчитывать на то, что это будет более эффективно, чем то, с чего вы начали, бенчмаркинг был бы разумным, если бы он имел для вас значение.

4
ответ дан 30 November 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: