deque.h
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C头文件 代码 · 共 545 行 · 第 1/2 页
H
545 行
destroy(start.current);
++start.current;
--length;
if (empty() || begin().current == begin().last)
deallocate_at_begin();
}
void pop_back() {
--finish.current;
destroy(finish.current);
--length;
if (empty() || end().current == end().first)
deallocate_at_end();
}
void swap(deque<T>& x) {
::swap(start, x.start);
::swap(finish, x.finish);
::swap(length, x.length);
::swap(map, x.map);
::swap(map_size, x.map_size);
}
iterator insert(iterator position, const T& x);
void insert(iterator position, size_type n, const T& x);
// template <class Iterator> void insert(iterator position,
// Iterator first, Iterator last);
void insert(iterator position, const T* first, const T* last);
void erase(iterator position);
void erase(iterator first, iterator last);
deque(size_type n, const T& value = T())
: start(), finish(), length(0), map(0), map_size(0) {
buffer_size = data_allocator.init_page_size();
insert(begin(), n, value);
}
// template <class Iterator> deque(Iterator first, Iterator last);
deque(const T* first, const T* last)
: start(), finish(), length(0), map(0), map_size(0) {
buffer_size = data_allocator.init_page_size();
copy(first, last, back_inserter(*this));
}
deque(const deque<T>& x)
: start(), finish(), length(0), map(0), map_size(0) {
buffer_size = data_allocator.init_page_size();
copy(x.begin(), x.end(), back_inserter(*this));
}
deque<T>& operator=(const deque<T>& x) {
if (this != &x)
if (size() >= x.size())
erase(copy(x.begin(), x.end(), begin()), end());
else
copy(x.begin() + size(), x.end(),
inserter(*this, copy(x.begin(), x.begin() + size(),
begin())));
return *this;
}
~deque();
};
template <class T>
deque<T>::data_allocator_type deque<T>::data_allocator;
template <class T>
deque<T>::map_allocator_type deque<T>::map_allocator;
template <class T>
deque<T>::size_type deque<T>::buffer_size = 0;
// should be data_allocator.init_page_size(); // Borland bug
template <class T>
bool operator==(const deque<T>& x, const deque<T>& y) {
return x.size() == y.size() && equal(x.begin(), x.end(), y.begin());
}
template <class T>
bool operator<(const deque<T>& x, const deque<T>& y) {
return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
}
template <class T>
deque<T>::~deque() { while (!empty()) pop_front(); }
template <class T>
void deque<T>::allocate_at_begin() {
pointer p = data_allocator.allocate(buffer_size);
if (!empty()) {
if (start.node == map) {
difference_type i = finish.node - start.node;
map_size = (i + 1) * 2;
map_pointer tmp = map_allocator.allocate(map_size);
copy(start.node, finish.node + 1, tmp + map_size / 4 + 1);
map_allocator.deallocate(map);
map = tmp;
map[map_size / 4] = p;
start = iterator(p + buffer_size, map + map_size / 4);
finish = iterator(finish.current, map + map_size / 4 + i + 1);
} else {
*--start.node = p;
start = iterator(p + buffer_size, start.node);
}
} else {
map_size = map_allocator.init_page_size();
map = map_allocator.allocate(map_size);
map[map_size / 2] = p;
start = iterator(p + buffer_size / 2 + 1, map + map_size / 2);
finish = start;
}
}
template <class T>
void deque<T>::allocate_at_end() {
pointer p = data_allocator.allocate(buffer_size);
if (!empty()) {
if (finish.node == map + map_size - 1) {
difference_type i = finish.node - start.node;
map_size = (i + 1) * 2;
map_pointer tmp = map_allocator.allocate(map_size);
copy(start.node, finish.node + 1, tmp + map_size / 4);
map_allocator.deallocate(map);
map = tmp;
map[map_size / 4 + i + 1] = p;
start = iterator(start.current, map + map_size / 4);
finish = iterator(p, map + map_size / 4 + i + 1);
} else {
*++finish.node = p;
finish = iterator(p, finish.node);
}
} else {
map_size = map_allocator.init_page_size();
map = map_allocator.allocate(map_size);
map[map_size / 2] = p;
start = iterator(p + buffer_size / 2, map + map_size / 2);
finish = start;
}
}
template <class T>
void deque<T>::deallocate_at_begin() {
data_allocator.deallocate(*start.node++);
if (empty()) {
start = iterator();
finish = start;
map_allocator.deallocate(map);
} else
start = iterator(*start.node, start.node);
}
template <class T>
void deque<T>::deallocate_at_end() {
data_allocator.deallocate(*finish.node--);
if (empty()) {
start = iterator();
finish = start;
map_allocator.deallocate(map);
} else
finish = iterator(*finish.node + buffer_size, finish.node);
}
template <class T>
deque<T>::iterator deque<T>::insert(iterator position, const T& x) {
if (position == begin()) {
push_front(x);
return begin();
} else if (position == end()) {
push_back(x);
return end() - 1;
} else if (end() - position > position - begin()) {
push_front(*begin());
copy(begin() + 2, position, begin() + 1);
*(position - 1) = x;
return position - 1;
} else {
push_back(*(end() - 1));
copy_backward(position, end() - 2, end() - 1);
*position = x;
return position;
}
}
template <class T>
void deque<T>::insert(iterator position, size_type n, const T& x) {
if (end() - position > position - begin()) {
iterator old_begin = begin();
if (n > position - old_begin) {
size_type m = n - (position - old_begin);
while (m-- > 0) push_front(x);
iterator i = position;
while (i != old_begin) push_front(*--i);
fill(old_begin, position, x);
} else {
iterator i = old_begin + n;
while (i != old_begin) push_front(*--i);
copy(old_begin + n, position, old_begin);
fill(position - n, position, x);
}
} else {
iterator old_end = end();
if (n > old_end - position) {
size_type m = n - (old_end - position);
while (m-- > 0) push_back(x);
iterator i = position;
while (i != old_end) push_back(*i++);
fill(position, old_end, x);
} else {
iterator i = old_end - n;
while (i != old_end) push_back(*i++);
copy_backward(position, old_end - n, old_end);
fill(position, position + n, x);
}
}
}
template <class T>
void deque<T>::insert(iterator position, const T* first, const T* last) {
size_type n = 0;
distance(first, last, n);
if (end() - position > position - begin()) {
iterator old_begin = begin();
if (n > position - old_begin) {
const T* m = last - (position - old_begin);
while (m != first) push_front(*--m);
iterator i = position;
while (i != old_begin) push_front(*--i);
copy(last - (position - old_begin), last, old_begin);
} else {
iterator i = old_begin + n;
while (i != old_begin) push_front(*--i);
copy(old_begin + n, position, old_begin);
copy(first, last, position - n);
}
} else {
iterator old_end = end();
if (n > old_end - position) {
const T* m = first + (old_end - position);
while (m != last) push_back(*m++);
iterator i = position;
while (i != old_end) push_back(*i++);
copy(first, first + (old_end - position), position);
} else {
iterator i = old_end - n;
while (i != old_end) push_back(*i++);
copy_backward(position, old_end - n, old_end);
copy(first, last, position);
}
}
}
template <class T>
void deque<T>::erase(iterator position) {
if (end() - position > position - begin()) {
copy_backward(begin(), position, position + 1);
pop_front();
} else {
copy(position + 1, end(), position);
pop_back();
}
}
template <class T>
void deque<T>::erase(iterator first, iterator last) {
difference_type n = last - first;
if (end() - last > first - begin()) {
copy_backward(begin(), first, last);
while(n-- > 0) pop_front();
} else {
copy(last, end(), first);
while(n-- > 0) pop_back();
}
}
#undef Allocator
#undef deque
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?