int btoi(const vector<int> &gray) { int i = 0; for (auto ri = gray.crbegin(); ri != gray.crend(); ++ri) { i = i * 2 + *ri; } return i; }
void print_revit(vector<double> vec) { std::cout << "\nMy vector contains" << std::endl; for(auto rit=vec.crbegin(); rit!=vec.crend();rit++){ std::cout <<"["<< *rit <<"]"<< " " ; } std::cout << "\nEnd of vector" << std::endl; }
void printReverse(vector<int> vec){ auto riter = vec.crbegin(); while (riter != vec.crend()) cout << *(riter++) << "\t"; cout << endl; auto iter = vec.cend(); while (iter != vec.cbegin()) cout << *(--iter) << "\t"; cout << endl; }
symbol* lookupSym(const string* x) { for(auto i=symbol_stack.crbegin(); i!=symbol_stack.crend(); ++i) { if(*i == nullptr) { continue; } symbol_table* pos = *i; auto result = pos->find(x); if(result!=pos->cend()) return result->second; } return NULL; }
int intValue() const { int p = 1; int val = 0; for (vector<const Symbol*>::const_reverse_iterator it = symbols_.crbegin(); it != symbols_.crend(); ++it) { val += (*it)->value() * p; p *= 20; } return val; }
bool lookup(const string* x) { for(auto i=symbol_stack.crbegin(); i!=symbol_stack.crend(); ++i) { if(*i == nullptr) { continue; } symbol_table* pos = *i; auto result = pos->find(x); if(result!=pos->cend()) return true; } return false; }
/** * Takes in a vector of terminals and combines * them to make one correctly formated string. */ string formatForOutput(const vector<string>& aResult) { // String to store final combined output. string myString; // Loop through vector to append parts. for(auto start = aResult.crbegin(); start != aResult.crend(); start++) { if(start == aResult.crend()-1) { // Last insert. myString.insert(0, (*start) ); } else if( (*start).find_first_of(".?:!,") != string::npos) { // If punctuation found. if((*start).find_first_not_of(".?:!,") != string::npos) { // Word includes punctuation. myString.insert(0, " "+(*start) ); } else { // Isolated Punctuation found. myString.insert(0, (*start) ); } } else { // Not punctuation. myString.insert(0, " "+(*start) ); } } return myString; }
T find_biggest_n_1_product(const vector<T> &A) { // Build forward product L, and backward product R vector<T> L, R(A.size()); partial_sum(A.cbegin(), A.cend(), back_inserter(L), multiplies<T>()); partial_sum(A.crbegin(), A.crend(), R.rbegin(), multiplies<T>()); // Find the biggest product of (n - 1) numbers T max_product = numeric_limits<T>::min(); for (int i = 0; i < A.size(); ++i) { T forward = i > 0 ? L[i - 1] : 1; T backward = i + 1 < A.size() ? R[i + 1] : 1; max_product = max(max_product, forward * backward); } return max_product; }
// DFS 遍历树,生成路径 void gen_path(const string &s, const vector<vector<bool> > &prev, int cur, vector<string> &path, vector<string> &result) { if (cur == 0) { string tmp; for (auto iter = path.crbegin(); iter != path.crend(); ++iter) tmp += *iter + " "; tmp.erase(tmp.end() - 1); result.push_back(tmp); } for (size_t i = 0; i < s.size(); ++i) { if (prev[cur][i]) { path.push_back(s.substr(i, cur - i)); gen_path(s, prev, i, path, result); path.pop_back(); } } }
// DFS 遍历树,生成路径 void gen_path(const string &s, const vector<vector<bool> > &prev, int cur, vector<string> &path, vector<string> &result) { if (cur == 0) { string tmp; //push的时候是逆序的,现在再逆过来 for (auto iter = path.crbegin(); iter != path.crend(); ++iter){ tmp += *iter + " "; } tmp.erase(tmp.end() - 1); result.push_back(tmp); } for (size_t i = 0; i < s.size(); ++i) { if (prev[i][cur]) { //如果从s[cur, i)是一个dict中的单词 path.push_back(s.substr(i, cur - i)); //把该单词入栈 gen_path(s, prev, i, path, result); //对字符串剩余部分递归 path.pop_back(); //还原现场 } } }
vector<Point> makeConvexHullPresorted(const vector<Point> &points) { if (points.size() <= 1) return vector<Point>(points); // Andrew's monotone chain algorithm. Positive y coordinates correspond to "up" // as per the mathematical convention, instead of "down" as per the computer // graphics convention. This doesn't affect the correctness of the result. vector<Point> upperHull; for (const Point &p : points) { while (upperHull.size() >= 2) { const Point &q = *(upperHull.cend() - 1); // Same as .back() const Point &r = *(upperHull.cend() - 2); if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) upperHull.pop_back(); else break; } upperHull.push_back(p); } upperHull.pop_back(); vector<Point> lowerHull; for (vector<Point>::const_reverse_iterator it = points.crbegin(); it != points.crend(); ++it) { const Point &p = *it; while (lowerHull.size() >= 2) { const Point &q = *(lowerHull.cend() - 1); // Same as .back() const Point &r = *(lowerHull.cend() - 2); if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) lowerHull.pop_back(); else break; } lowerHull.push_back(p); } lowerHull.pop_back(); if (!(upperHull.size() == 1 && upperHull == lowerHull)) upperHull.insert(upperHull.end(), lowerHull.cbegin(), lowerHull.cend()); return upperHull; }
//辅助函数,生成路径,DFS void wordbreak_genpath(const string &s, const vector<vector<bool>> &prev, int cur, vector<string> &path, vector<string> &result) { if (cur == 0) { string tmp; //反转 for (auto iter = path.crbegin(); iter != path.crend(); ++iter) { tmp += *iter + " "; } //删除最后的一个空格 tmp.erase(tmp.end() - 1); result.push_back(tmp); } for (size_t i = 0; i < s.size(); i++) { if (prev[cur][i]) { path.push_back(s.substr(i, cur - i)); wordbreak_genpath(s, prev, i, path, result); path.pop_back(); } } }