finish bonus 1
This commit is contained in:
@ -3,7 +3,7 @@ Project(STLite-ACM-2024)
|
|||||||
include(CTest)
|
include(CTest)
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")
|
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)
|
include(FetchContent)
|
||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
googletest
|
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\
|
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")
|
&& 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_subdirectory(test)
|
||||||
|
add_executable(subtask1 ${CMAKE_CURRENT_SOURCE_DIR}/src/subtask1.cpp)
|
@ -8,6 +8,7 @@
|
|||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <iterator>
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
#include <queue> // only for debug use
|
#include <queue> // only for debug use
|
||||||
#include <vector> // only for debug use
|
#include <vector> // only for debug use
|
||||||
@ -16,7 +17,7 @@
|
|||||||
#include "utility.hpp"
|
#include "utility.hpp"
|
||||||
|
|
||||||
namespace sjtu {
|
namespace sjtu {
|
||||||
|
struct map_iterator_tag : std::bidirectional_iterator_tag {};
|
||||||
template <class Key, class T, class Compare = std::less<Key> >
|
template <class Key, class T, class Compare = std::less<Key> >
|
||||||
class map {
|
class map {
|
||||||
public:
|
public:
|
||||||
@ -398,7 +399,7 @@ class map {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// Add some type traits
|
// 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 pair<const Key, T> value_type;
|
||||||
typedef std::ptrdiff_t difference_type;
|
typedef std::ptrdiff_t difference_type;
|
||||||
typedef value_type *pointer;
|
typedef value_type *pointer;
|
||||||
@ -490,7 +491,7 @@ class map {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// Add some type traits
|
// 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 pair<const Key, T> value_type;
|
||||||
typedef std::ptrdiff_t difference_type;
|
typedef std::ptrdiff_t difference_type;
|
||||||
typedef value_type *pointer;
|
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