Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions deque.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3014,8 +3014,8 @@ class deque
return begin();
}
// 此时容器一定不为空
auto const back_diff = end_pre - pos + ::std::size_t(0);
auto const front_diff = pos - begin_pre + ::std::size_t(0);
auto const back_diff = end_pre - pos;
auto const front_diff = pos - begin_pre;
// NB:
// 如果args是当前容器的元素的引用,那么必须使得该元素先被emplace_back/front后再被移动到正确位置,否则该引用会失效,同时reserve不会导致引用失效
// 此处逻辑和无分配器版本稍微不一样
Expand All @@ -3024,7 +3024,7 @@ class deque
reserve_back_(::std::size_t(2));
emplace_back_noalloc_(::std::forward<Args>(args)...); // 满足标准要求经过A::construct
// back_emplace向后移动1个元素并插入,因此先reserve以获得一个不失效的pos
auto new_pos = begin() + static_cast<difference_type>(front_diff);
auto new_pos = begin() + front_diff;
back_emplace_(new_pos.block_elem_curr_, new_pos.elem_curr_);
*new_pos = ::std::move(back());
pop_back();
Expand All @@ -3034,7 +3034,7 @@ class deque
{
reserve_front_(::std::size_t(2));
emplace_front_noalloc_(::std::forward<Args>(args)...);
auto new_pos = end() - static_cast<difference_type>(back_diff);
auto new_pos = end() - back_diff;
front_emplace_(new_pos.block_elem_curr_, new_pos.elem_curr_);
*(--new_pos) = ::std::move(front());
pop_front();
Expand Down Expand Up @@ -3130,20 +3130,20 @@ class deque
}
auto const front_diff = pos - begin_pre;
auto const back_diff = end_pre - pos;
auto const old_size = front_diff + back_diff;
auto const old_size = static_cast<size_type>(front_diff + back_diff);
if (back_diff <= front_diff)
{
partial_guard_<true> guard(this, static_cast<size_type>(old_size));
partial_guard_<true> guard(this, old_size);
append_range_noguard_(first, last);
guard.release();
::std::rotate(begin() + front_diff, begin() + old_size, end());
::std::rotate(begin() + front_diff, begin() + static_cast<difference_type>(old_size), end());
}
else
{
partial_guard_<false> guard(this, static_cast<size_type>(old_size));
partial_guard_<false> guard(this, old_size);
prepend_range_noguard_(first, last);
guard.release();
::std::rotate(begin(), begin() + (static_cast<difference_type>(size()) - old_size), end() - back_diff);
::std::rotate(begin(), begin() + static_cast<difference_type>(size() - old_size), end() - back_diff);
}
return begin() + front_diff;
}
Expand Down