finish bonus 1
This commit is contained in:
@ -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
|
||||
|
@ -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)
|
@ -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
18
map/src/subtask1.cpp
Normal 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
32
map/src/subtask1.hpp
Normal 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
|
Reference in New Issue
Block a user