টি এল; ডিআর
যে কোনও ব্যবহার করুন। তারা প্রায় একই।
বিরক্তিকর উত্তর
যথারীতি যথাযথ এবং কুফল রয়েছে।
ব্যবহার std::reverse_iterator
:
- আপনি যখন কাস্টম ধরণের বাছাই করছেন এবং আপনি প্রয়োগ করতে চান না
operator>()
- আপনি টাইপ করতে খুব অলস যখন
std::greater<int>()
std::greater
যখন ব্যবহার করুন :
- আপনি আরও সুস্পষ্ট কোড পেতে চাইলে
- যখন আপনি অস্পষ্ট বিপরীত পুনরাবৃত্তি ব্যবহার করা এড়াতে চান
কর্মক্ষমতা হিসাবে, উভয় পদ্ধতি সমান দক্ষ। আমি নিম্নলিখিত মানদণ্ড চেষ্টা করেছি:
#include <algorithm>
#include <chrono>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std::chrono;
/* 64 Megabytes. */
#define VECTOR_SIZE (((1 << 20) * 64) / sizeof(int))
/* Number of elements to sort. */
#define SORT_SIZE 100000
int main(int argc, char **argv) {
std::vector<int> vec;
vec.resize(VECTOR_SIZE);
/* We generate more data here, so the first SORT_SIZE elements are evicted
from the cache. */
std::ifstream urandom("/dev/urandom", std::ios::in | std::ifstream::binary);
urandom.read((char*)vec.data(), vec.size() * sizeof(int));
urandom.close();
auto start = steady_clock::now();
#if USE_REVERSE_ITER
auto it_rbegin = vec.rend() - SORT_SIZE;
std::sort(it_rbegin, vec.rend());
#else
auto it_end = vec.begin() + SORT_SIZE;
std::sort(vec.begin(), it_end, std::greater<int>());
#endif
auto stop = steady_clock::now();
std::cout << "Sorting time: "
<< duration_cast<microseconds>(stop - start).count()
<< "us" << std::endl;
return 0;
}
এই কমান্ড লাইনের সাথে:
g++ -g -DUSE_REVERSE_ITER=0 -std=c++11 -O3 main.cpp \
&& valgrind --cachegrind-out-file=cachegrind.out --tool=cachegrind ./a.out \
&& cg_annotate cachegrind.out
g++ -g -DUSE_REVERSE_ITER=1 -std=c++11 -O3 main.cpp \
&& valgrind --cachegrind-out-file=cachegrind.out --tool=cachegrind ./a.out \
&& cg_annotate cachegrind.out
std::greater
demo
std::reverse_iterator
demo
সময় একই। ভালগ্রাইন্ড একই সংখ্যক ক্যাশে মিস করার প্রতিবেদন করে।