C++でレストランの食品注文の表を表示する
顧客がレストランで行った注文を表す配列注文があるとします。したがって、orders [i] =[cust_namei、table_numi、food_itemi]ここで、cust_nameiは顧客名、table_numiは顧客テーブル番号、food_itemiは顧客注文のアイテムです。
レストランの「ディスプレイテーブル」を返却する必要があります。ここで、「表示テーブル」は、各テーブルが注文した各食品の数を行エントリが示すテーブルです。最初の列はテーブル番号になり、残りの列はアルファベット順に各食品に対応します。最初の行は、最初の列が「テーブル」で、その後に食品の名前が続くヘッダーである必要があります。
したがって、入力がorders =[["Amal"、 "3"、 "Paratha"]、["Bimal"、 "10"、 "Biryni"]、["Amal"、 "3"、"フライドチキンの場合"]、[" Raktim "、" 5 "、" Water "]、[" Raktim "、" 5 "、" Paratha "]、[" Deepak "、" 3 "、" Paratha "]]、出力はbe [["Table"、 "Biryni"、 "Fried Chicken"、 "Paratha"、 "Water"]、["3"、 "0"、 "1"、 "2"、 "0"]、["5 "、" 0 "、" 0 "、" 1 "、" 1 "]、[" 10 "、" 1 "、" 0 "、" 0 "、" 0 "]]
これを解決するには、次の手順に従います-
-
1つのマップを定義するm
-
1つのセット名を定義する
-
1つのセットを定義するt
-
各要素について、注文リストに記載されています
-
it[1]をt
に挿入します -
ok:=true
-
okがfalseの場合、-
-
v=空白スペースを使用して[2]分割した後の配列
-
vの各要素xについて、実行
-
(m [it [1]、x]を1増やします)
-
名前にxを挿入
-
-
-
それ以外の場合
-
(m [it [1]、it [2]]を1増やします)
-
it[2]を名前に挿入
-
-
-
1つの2D配列retを定義する
-
配列の一時を定義し、名前から要素をコピーします
-
最初の要素として「テーブル」をtempに挿入します
-
retの最後にtempを挿入します
-
t内の要素ごとに、実行します
-
配列を定義するte
-
teの最後に挿入します
-
名前の要素xごとに、次のようにします
-
teの最後に文字列としてm[it、x]を挿入します
-
-
retの最後にteを挿入します
-
-
配列を並べ替えますret
-
retを返す
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<string> > v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << "[";
for(int j = 0; j <v[i].size(); j++){
cout << v[i][j] << ", ";
}
cout << "],";
}
cout << "]"<<endl;
}
typedef long long int lli;
class Solution {
public:
vector <string> split(string& s, char delimiter){
vector <string> tokens;
string token;
istringstream tokenStream(s);
while(getline(tokenStream, token, delimiter)){
tokens.push_back(token);
}
return tokens;
}
static bool cmp(vector <string>& a, vector <string>& b){
lli an = stol(a[0]);
lli bn = stol(b[0]);
return an < bn;
}
vector<vector<string>> displayTable(vector<vector<string>>& o) {
map <string, map < string, int> >m;
set <string> names;
set <string> t;
for(auto &it : o){
t.insert(it[1]);
bool ok = true;
if(!ok){
vector <string> v = split(it[2], ' ');
for(auto& x : v){
m[it[1]][x]++;
names.insert(x);
}
}
else{
m[it[1]][it[2]]++;
names.insert(it[2]);
}
}
vector < vector <string> > ret;
vector <string> temp(names.begin(), names.end());
temp.insert(temp.begin(), "Table");
ret.push_back(temp);
for(auto& it : t){
vector <string> te;
te.push_back(it);
for(auto& x : names){
te.push_back(to_string(m[it][x]));
}
ret.push_back(te);
}
sort(ret.begin() + 1, ret.end(), cmp);
return ret;
}
};
main(){
Solution ob;
vector<vector<string>> v = {{"Amal","3","Paratha"},{"Bimal","10","Biryni"},{"Amal","3","Fried
Chicken"},{"Raktim","5","Water"},{"Raktim","5","Paratha"},{"Deepak"," 3","Paratha"}};
print_vector(ob.displayTable(v));
} 入力
{{"Amal","3","Paratha"},{"Bimal","10","Biryni"},{"Amal","3","Fried Chicken"},{"Raktim","5","Water"},{"Raktim","5","Paratha"},{"Deepak"," 3","Paratha"}} 出力
[[Table, Biryni, Fried Chicken, Paratha, Water, ],[3, 0, 1, 2, 0, ],[5, 0, 0, 1, 1, ],[10, 1, 0, 0, 0, ],]
-
C++での文字列のトークン化
このセクションでは、C++で文字列をトークン化する方法を説明します。 Cでは、文字配列にstrtok()関数を使用できます。ここに文字列クラスがあります。次に、その文字列から区切り文字を使用して文字列を切り取る方法を説明します。 C ++機能を使用するには、文字列を文字列ストリームに変換する必要があります。次に、getline()関数を使用して、タスクを実行できます。 getline()関数は、文字列ストリーム、出力を送信するための別の文字列、およびストリームのスキャンを停止するための区切り文字を受け取ります。 関数がどのように機能しているかを理解するために、次の例を見てみましょう。 サン
-
C ++で文字列をトークン化しますか?
最初の方法は、文字列ストリームを使用して、スペースで区切られた単語を読み取ることです。これは少し制限されていますが、適切なチェックを提供すれば、タスクはかなりうまくいきます。 例 #include <vector> #include <string> #include <sstream> using namespace std; int main() { string str("Hello from the dark side"); string tmp; // A string