finish bonus 1

This commit is contained in:
2024-03-28 02:55:26 +00:00
parent 3617fde501
commit 8132ef130a
5 changed files with 57 additions and 5 deletions

View File

@ -3,7 +3,7 @@ Project(STLite-ACM-2024)
include(CTest)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -fsanitize=address")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -fsanitize=address -fsanitize=undefined -fsanitize=leak")
include(FetchContent)
FetchContent_Declare(
googletest

View File

@ -31,3 +31,4 @@ add_test(NAME mp_five COMMAND sh -c "${CMAKE_CURRENT_BINARY_DIR}/mp_five >/tmp/f
add_test(NAME mp_five_mem COMMAND sh -c "${CMAKE_CURRENT_BINARY_DIR}/mp_five_mem >/tmp/five_mem_out.txt\
&& diff -u ${CMAKE_CURRENT_SOURCE_DIR}/data/five.memcheck/answer.txt /tmp/five_mem_out.txt>/tmp/five_mem_diff.txt")
add_subdirectory(test)
add_executable(subtask1 ${CMAKE_CURRENT_SOURCE_DIR}/src/subtask1.cpp)

View File

@ -8,6 +8,7 @@
#include <cassert>
#include <cstddef>
#include <functional>
#include <iterator>
#ifndef NDEBUG
#include <queue> // only for debug use
#include <vector> // only for debug use
@ -16,7 +17,7 @@
#include "utility.hpp"
namespace sjtu {
struct map_iterator_tag : std::bidirectional_iterator_tag {};
template <class Key, class T, class Compare = std::less<Key> >
class map {
public:
@ -398,7 +399,7 @@ class map {
public:
// Add some type traits
typedef std::bidirectional_iterator_tag iterator_category;
typedef sjtu::map_iterator_tag iterator_category;
typedef pair<const Key, T> value_type;
typedef std::ptrdiff_t difference_type;
typedef value_type *pointer;
@ -490,7 +491,7 @@ class map {
public:
// Add some type traits
typedef std::bidirectional_iterator_tag iterator_category;
typedef sjtu::map_iterator_tag iterator_category;
typedef pair<const Key, T> value_type;
typedef std::ptrdiff_t difference_type;
typedef value_type *pointer;

18
map/src/subtask1.cpp Normal file
View File

@ -0,0 +1,18 @@
#include "subtask1.hpp"
#include <iostream>
#include <list>
int main() {
sjtu::map<int, int> mp;
for (int i = 1; i <= 10; i++) mp[i] = i + 5;
for (auto item : mp) {
std::cout << item.first << " " << item.second << std::endl;
}
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> b = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
sjtu::my_sort(mp.begin(), mp.end());
sjtu::my_sort(a, a + 10);
sjtu::my_sort(b.begin(), b.end());
std::list<int> lst = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// sjtu::my_sort(lst.begin(), lst.end());
return 0;
}

32
map/src/subtask1.hpp Normal file
View File

@ -0,0 +1,32 @@
#include <algorithm>
#include <iterator>
#include <type_traits>
#include "map.hpp"
namespace sjtu {
template <typename _Tp>
static constexpr bool is_iterator_v = requires() {
typename std::iterator_traits<_Tp>::iterator_category;
typename std::iterator_traits<_Tp>::difference_type;
typename std::iterator_traits<_Tp>::value_type;
typename std::iterator_traits<_Tp>::pointer;
typename std::iterator_traits<_Tp>::reference;
};
template <typename _Iter>
void my_sort(_Iter __first, _Iter __last) {
if constexpr (is_iterator_v<_Iter>) {
using category = typename std::iterator_traits<_Iter>::iterator_category;
if constexpr (std::is_same_v<sjtu::map_iterator_tag, category>) {
return;
} else if constexpr (std::is_base_of_v<std::random_access_iterator_tag, category>) {
std::sort(__first, __last);
return;
} else
static_assert(std::is_base_of_v<std::random_access_iterator_tag, category>,
"Not a random access iterator or a iterator from already sorted container.");
} else
static_assert(sjtu::is_iterator_v<_Iter>, "Not an iterator.");
}
} // namespace sjtu