remove O(n^2) complexity from range and initialiser list inserts #7

This commit is contained in:
2019-05-31 05:29:54 +07:00
parent 36a517d927
commit d906bf57e0
9 changed files with 81 additions and 12 deletions

View File

@@ -0,0 +1,25 @@
/*******************************************************************************
* This file is part of the "https://github.com/blackmatov/flat.hpp"
* For conditions of distribution and use, see copyright notice in LICENSE.md
* Copyright (C) 2019, by Matvey Cherevko (blackmatov@gmail.com)
******************************************************************************/
#pragma once
namespace flat_hpp::detail
{
template < typename Compare >
class eq_compare : public Compare {
public:
eq_compare() = default;
eq_compare(const Compare& compare)
: Compare(compare) {}
template < typename L, typename R >
bool operator()(const L& l, const R& r) const {
return !Compare::operator()(l, r)
&& !Compare::operator()(r, l);
}
};
}

View File

@@ -15,6 +15,7 @@
#include <type_traits>
#include <initializer_list>
#include "detail/eq_compare.hpp"
#include "detail/pair_compare.hpp"
#include "detail/is_transparent.hpp"
@@ -319,9 +320,13 @@ namespace flat_hpp
template < typename InputIter >
void insert(InputIter first, InputIter last) {
while ( first != last ) {
insert(*first++);
}
const auto mid_iter = data_.insert(data_.end(), first, last);
std::sort(mid_iter, data_.end(), value_comp());
std::inplace_merge(data_.begin(), mid_iter, data_.end());
data_.erase(
std::unique(data_.begin(), data_.end(),
detail::eq_compare<value_compare>(value_comp())),
data_.end());
}
void insert(std::initializer_list<value_type> ilist) {

View File

@@ -15,6 +15,7 @@
#include <type_traits>
#include <initializer_list>
#include "detail/eq_compare.hpp"
#include "detail/pair_compare.hpp"
#include "detail/is_transparent.hpp"
@@ -315,9 +316,9 @@ namespace flat_hpp
template < typename InputIter >
void insert(InputIter first, InputIter last) {
while ( first != last ) {
insert(*first++);
}
const auto mid_iter = data_.insert(data_.end(), first, last);
std::sort(mid_iter, data_.end(), value_comp());
std::inplace_merge(data_.begin(), mid_iter, data_.end());
}
void insert(std::initializer_list<value_type> ilist) {

View File

@@ -15,6 +15,7 @@
#include <type_traits>
#include <initializer_list>
#include "detail/eq_compare.hpp"
#include "detail/is_transparent.hpp"
namespace flat_hpp
@@ -242,9 +243,9 @@ namespace flat_hpp
template < typename InputIter >
void insert(InputIter first, InputIter last) {
while ( first != last ) {
insert(*first++);
}
const auto mid_iter = data_.insert(data_.end(), first, last);
std::sort(mid_iter, data_.end(), value_comp());
std::inplace_merge(data_.begin(), mid_iter, data_.end());
}
void insert(std::initializer_list<value_type> ilist) {

View File

@@ -15,6 +15,7 @@
#include <type_traits>
#include <initializer_list>
#include "detail/eq_compare.hpp"
#include "detail/is_transparent.hpp"
namespace flat_hpp
@@ -246,9 +247,13 @@ namespace flat_hpp
template < typename InputIter >
void insert(InputIter first, InputIter last) {
while ( first != last ) {
insert(*first++);
}
const auto mid_iter = data_.insert(data_.end(), first, last);
std::sort(mid_iter, data_.end(), value_comp());
std::inplace_merge(data_.begin(), mid_iter, data_.end());
data_.erase(
std::unique(data_.begin(), data_.end(),
detail::eq_compare<value_compare>(value_comp())),
data_.end());
}
void insert(std::initializer_list<value_type> ilist) {