@目錄山茶花100ptsT1區間逆序對60pts100pts 區間操作固定套路,轉化為首碼操作dream20pts 神奇分塊杭州:轉化題意,正難則反正難則反(或者對於這種有刪邊操作的題), 我們看成反向加邊看題:構造坐飛機:斜率優化DP抓頹 : 啟髮式合併 + stl大雜燴討厭的線段樹Foo Fig ...
C++11起,引入了基於範圍的for迴圈這一特性,有什麼好處呢?它有時可以大大地簡化遍歷容器的操作,比如說STL的vector。
std::vector v{1, 2, 3};
std::vector<int>::iterator it = begin(v);
for (; it != end(v); ++it)
std::cout << *it << '\n';
這是使用了迭代器的寫法,這時候我們的C++11的for迴圈就可以大展身手了。
std::vector v{1, 2, 3};
for (const auto& item : v)
std::cout << item << '\n';
當然,除了STL,數組的遍歷也是沒問題的。接下來到了本篇的主線,假如說我定義了一個數據結構,如下:
template <typename _Tp, std::size_t N>
struct Container {
using value_type = _Tp;
_Tp arr[N];
std::size_t size() {
return N;
}
Container() {
for (std::size_t i{}; i < N; ++i)
arr[i] = i;
}
};
這時候當我們也想使用之前的操作的時候,我們會發現
信息有點多,不過很容易就註意到了兩個關鍵點,分別是begin和end,我們可以為其提供一個介面看看。
template <typename _Tp, std::size_t N>
struct Container {
using value_type = _Tp;
_Tp arr[N + 1];
std::size_t size() {
return N;
}
Container() {
for (std::size_t i{}; i < N; ++i)
arr[i] = i;
}
constexpr _Tp *begin() noexcept {
return &arr[0];
}
constexpr _Tp *end() noexcept {
return &arr[N];
}
};
因為STL的end指針是指向最後一個元素的下一位,所以我們數組額外開多一個空間,經過此次修改,就能成功運行了。