是否可以将输出更改为显示重复一次,后跟一个表示发生次数的数字



这是一个非常新的编程,我制作了一个简单的购物清单计划器,按照商店中出现的顺序组织中间人。我有以下输出:以下是您需要的:巴塔提椰菜白萝卜胡萝卜樱桃汤姆牛肉牛肉鸡鸡LohiCreme Fraiche鸡蛋Kermaviili干酪Tomatti Murska通心粉通心粉即食鸡肉

但我想:以下是您需要的:巴塔提椰菜白萝卜胡萝卜樱桃汤姆牛肉*2鸡肉*2LohiCreme Fraiche鸡蛋Kermaviili干酪Tomatti Murska马卡罗尼*2

这有可能吗?

#include <iostream>
#include <map>
#include <string>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <fstream>
#include <cstring>
#include <algorithm>
#include <bits/stdc++.h>
main() {
char aWord[20];
std::vector<std::string> Vege {};
std::vector<std::string> Meat {};
std::vector<std::string> Eines {};
std::vector<std::string> Milk {};
std::vector<std::string> Bread {};
std::vector<std::string> Cheese {};
std::vector<std::string> Preservative {};
std::vector<std::string> Pasta {};
std::vector<std::string> Texmex {};
std::vector<std::string> Frozen {};
std::vector<std::string> Actualshoppinglist {"Heres what you need:"};

std::ifstream file("Shoppinglist.txt");
while (file.good()) {
file>>aWord;
if (file.good() && strcmp(aWord, "Tortillat") == 0) {
Meat.push_back("Beef");
Vege.push_back("SaladnCucumbernTomato");
Texmex.push_back("Tortilla wrapsnSalsa");
} else if (file.good() && strcmp(aWord, "Chicken_Soup") == 0) {
Meat.push_back("Chicken");
Milk.push_back("Creme Fraiche");
Frozen.push_back("Keittojuures");
} else if (file.good() && strcmp(aWord, "Mexican_pata") == 0) {
Meat.push_back("Beef");
Preservative.push_back("Tomaatti murska");
Pasta.push_back("Raketti Spaghetti");
} else if (file.good() && strcmp(aWord, "Lasagne") == 0) {
Meat.push_back("Beef");
Preservative.push_back("Tomaatti Murska");
Cheese.push_back("Cheese");
Vege.push_back("Carrot");
} else if (file.good() && strcmp(aWord, "Macaroni_laattiko") == 0) {
Meat.push_back("Beef");
Milk.push_back("Eggs");
Pasta.push_back("Macaroni");
} else if (file.good() && strcmp(aWord, "Chicken_Breasts") == 0) {
Meat.push_back("Chicken");
Vege.push_back("BataatinBrocolinTurnip");
Frozen.push_back("Keittojuures");
} else if (file.good() && strcmp(aWord, "Chicken_Sauce") == 0) {
Meat.push_back("Chicken");
Vege.push_back("Brocoli");
Pasta.push_back("Pasta");
Milk.push_back("Cream");
} else if (file.good() && strcmp(aWord, "Chicken_Tortilla") == 0) {
Meat.push_back("Chicken");
Vege.push_back("SaladnCucumbernTomato");
Texmex.push_back("Salsa");
Preservative.push_back("Pineapple");
} else if (file.good() && strcmp(aWord, "Fishfingers_and_mash") == 0) {
Frozen.push_back("FishfingersnPeas");
Milk.push_back("Kermaviili");
} else if (file.good() && strcmp(aWord, "Lohi_Medaljonki") == 0) {
Eines.push_back("Lohi");
Vege.push_back("Cherry toms");
Milk.push_back("Kermaviili");
} else if (file.good() && strcmp(aWord, "Tuna pasta") == 0) {
Milk.push_back("Cream");
Preservative.push_back("Tuna");
Pasta.push_back("Pasta");
} else if (file.good() && strcmp(aWord, "Ready_chicken_food") == 0) {
Frozen.push_back("Ready Chicken");
} else if (file.good() && strcmp(aWord, "Chilicon") == 0) {
Preservative.push_back("Tomaatti murskanBean mix");
Pasta.push_back("Rice");

} else {
std::cout << "";
}
}
std::sort(Meat.begin(), Meat.end());
std::sort(Vege.begin(), Vege.end());
std::sort(Eines.begin(), Eines.end());
std::sort(Milk.begin(), Milk.end());
std::sort(Bread.begin(), Bread.end());
std::sort(Cheese.begin(), Cheese.end());
std::sort(Preservative.begin(), Preservative.end());
std::sort(Pasta.begin(), Pasta.end());
std::sort(Texmex.begin(), Texmex.end());
std::sort(Frozen.begin(), Frozen.end());
Actualshoppinglist.insert( Actualshoppinglist.end(), Vege.begin(), Vege.end() );
Actualshoppinglist.insert( Actualshoppinglist.end(), Meat.begin(), Meat.end() );
Actualshoppinglist.insert( Actualshoppinglist.end(), Eines.begin(), Eines.end() );
Actualshoppinglist.insert( Actualshoppinglist.end(), Milk.begin(), Milk.end() );
Actualshoppinglist.insert( Actualshoppinglist.end(), Bread.begin(), Bread.end() );
Actualshoppinglist.insert( Actualshoppinglist.end(), Cheese.begin(), Cheese.end() );
Actualshoppinglist.insert( Actualshoppinglist.end(), Preservative.begin(), Preservative.end() );
Actualshoppinglist.insert( Actualshoppinglist.end(), Pasta.begin(), Pasta.end() );
Actualshoppinglist.insert( Actualshoppinglist.end(), Texmex.begin(), Texmex.end() );
Actualshoppinglist.insert( Actualshoppinglist.end(), Frozen.begin(), Frozen.end() );
std::ofstream file_out("ActualShoppinglist.txt");
for(std::size_t i = 0; i < Actualshoppinglist.size(); ++i)
file_out << Actualshoppinglist[i] << std::endl; 
}

首先,对每种类型的食物使用单独的矢量只会造成问题。您最好将列表存储在std::map:中

std::map<std::string, std::vector<std::string>> items;

现在你可以做:

items["Meat"].push_back("Beef");
items["Vege"].push_back("Salad");
items["Vege"].push_back("Cucumber");
items["Vege"].push_back("Tomato");
items["Texmex"].push_back("Tortilla wraps");
items["Texmex"].push_back("Salsa");

但为什么要到此为止呢?看看我们是如何重复";素食主义者"创建等待发生的错误(由于键入错误(或通常创建维护问题。你可以用枚举来解决这个问题:

enum Category {
Vege,
Meat,
Eines,
Milk,
Bread,
Cheese,
Preservative,
Pasta,
Texmex,
Frozen,
};
std::map<Category, std::vector<std::string>> items;
items[Meat].push_back("Beef");
items[Vege].push_back("Salad");
items[Vege].push_back("Cucumber");
items[Vege].push_back("Tomato");
items[Texmex].push_back("Tortilla wraps");
items[Texmex].push_back("Salsa");

这让事情变得更干净了。你可以这样创建完整的购物清单:

std::vector<std::string> shoppingList;
for (const auto& sublist : items) {
shoppingList.insert(shoppingList.end(), sublist.begin(), sublist.end());
}

现在,计数呢?一种方法是将子列表转换为std::map,其中项目名称为字符串,然后计数为数据:

std::map<Category, std::map<std::string, int>> items;

有了以上内容,您可以通过计数添加一个或多个项目:

items[Meat]["Beef"]++;
items[Meat]["Beef"]++;

或者:

items[Meat]["Beef"] += 10;  // need lots of beef!

你甚至可能想要制作一个函数:

void Add(std::map<Category, std::map<std::string, int>>& items,
Category category, const std::string& item, int count = 1)
{
items[category][name] += count;
}

并像一样使用它

Add(items, Meat, "Beef");
Add(items, Vege, "Perilla Leaves", 100000);

这会稍微改变你的完整购物清单生成:

std::vector<std::string> shoppingList;
for (const auto& sublist : items) {
for (const auto& entry : sublist) {
const std::string& name = entry.first;
int count = entry.second;
if (count == 1) {
// Add single item
shoppingList.push_back(name);
} else {
// Add item with its count
std::ostringstream oss;
oss << name << " *" << count;
shoppingList.push_back(oss.str());
}
}
}

将项目存储在映射中有一个副作用,即映射是有序的。因此,子列表中的项目将按字母顺序排序。

如果你不想这样,那么你需要将它们存储在原始向量中一次或多次,创建一个临时映射来计算向量中的所有内容,然后遍历向量。您只添加映射中计数为非零的项目,然后在添加该项目后,将其计数设置为零以防止再次添加。这一切都有点麻烦,但如果你真的想继续——这是一个很好的锻炼方法。

相关内容

最新更新