我正在尝试学习C ++并遇到了这个问题陈述
我们的营销部门刚刚与几家当地商家达成协议,这将使我们能够每天为我们的顶级客户提供各种产品的独家折扣。问题在于我们只能向每位客户提供每种产品,而我们可能只向每位客户提供一种产品。
每天我们都会获得有资格享受这些特殊折扣的产品清单。然后,我们必须决定向哪些客户提供哪些产品。幸运的是,我们的高技能统计人员团队开发了一个惊人的数学模型,通过计算我们称之为“适用性分数”(SS)来确定给定客户购买所提供产品的可能性。计算客户和产品之间SS的绝密算法是:
1。如果产品名称中的字母数是偶数,则SS是客户名称中的元音数量(a,e,i,o,u,y)乘以1.5。
2.如果产品名称中的字母数为奇数,则SS为客户名称中的辅音数量。
3.如果产品名称中的字母数与客户名称中的字母数共享任何公共因子(除1之外),则SS乘以1.5。
您的任务是实施一个程序,为每个客户分配一个产品,以最大化所有选定产品的总SS。请注意,可能会有不同数量的产品和客户。只要您引用源代码,就可以包含外部库中的代码。
您的程序应该接受作为其唯一参数的文件路径。此文件中的每一行都是一个测试用例。每个测试用例都是以逗号分隔的客户名称集合,后跟分号,然后是逗号分隔的产品名称集合。假设输入文件是ASCII编码的。例如(注意:以下示例有3个测试用例):
Jack Abraham,John Evans,Ted Dziuba; iPad 2 - 4件装,Girl Scouts Thin Mints,Nerf Crossbow
Jeffery Lebowski,Walter Sobchak,Theodore Donald Kerabatsos,Peter Gibbons,Michael Bolton,Samir Nagheenanajar; Half&一半,Colt M1911A1,16lb保龄球,红色Swingline订书机,打印纸,Vibe杂志订阅 - 40包Jareau Wade,Rob Eroh,Mahmoud Abdelkader,Wenyi Cai,Justin Van Winkle,Gabriel Sinkin,Aaron Adelson;蝙蝠侠1号,足球 - 官方尺寸,低音放大耳机,大象食物 - 1024磅,三只狼One Moon T恤,Dom Perignon 2000 Vintage
对于每行输入,将最大总分打印到两位小数。对于上面的示例输入,输出应如下所示:
21.00
83.50
71.25
在我的程序中,我创建了一个字符串的2D矢量
`std::vector<std::vector<std::string>`
我希望将输入文件中每行的名称存储为第二维的字符串
让我们说2D矢量的名称是 a ,我有一个字符串“Dexobox Valektra” 如果向量可以被视为数组,则需要将其推入位置 a [0] [0] 。
我尝试使用push_back的是 a [i] .push_back(令牌),它会在运行时编译但会导致分段错误。
我该如何解决这个问题?有没有不同的方法来推进向量的第二维?
我正在使用例程将逗号分隔符和push_back的名称分隔为向量
这是代码段:
void comma_seprate(std::string s, std::vector < std::vector<std::string> >& a , int i)
{
std::istringstream ss(s);
std::string token;
int j = 0;
while(std::getline(ss, token, ','))
{
a[i].push_back(token); //this is the line causing segmentation fault at runtime
std::cout << token << std::endl;
j++;
}
}
以下是完整的代码:
#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
#include <vector>
#include <sstream>
#define DEBUG
void comma_seprate(std::string s, std::vector < std::vector<std::string> >& a , int i)
{
std::istringstream ss(s);
std::string token;
int j = 0;
while(std::getline(ss, token, ','))
{
a[i].push_back(token);
std::cout << token << std::endl;
j++;
}
}
void split_string( std::string s, std::vector<std::string>& v, std::vector<std::string>& u )
{
std::string delimiter = ";";
v.push_back (s.substr(0, s.find(delimiter)));
u.push_back (s.substr(s.find(delimiter)+1,s.size()));
}
int main ( int argc, char** argv )
{
//variable for file name
std::string filename;
//error handling for invalid argument size
if ( argc > 2 || argc < 2 )
{
std::cerr <<"filename missing! Usage: " << argv[0] << " <input_filename>"<< std::endl;
return EXIT_FAILURE;
}
//=========================================================================
//Using C style debugging : Any other way to do this in c++?
#ifdef DEBUG
std::cout << "filename :"<<filename << "\t num_arguments: " << argc << std::endl;
#endif
//=========================================================================
//opening the file for reading
std::ifstream in(argv[1]);
std::vector<std::string> line_vec;
std::string temp_line;
int line_count = 0;
while(std::getline(in,temp_line))
{
line_count++;
//Ignores any empty lines in the input file
if(temp_line.empty())
continue;
line_vec.push_back(temp_line);
}
//=========================================================================
#ifdef DEBUG
std::cout <<"\nPrinting out contents of the line_vec" <<std::endl;
for (int i=0; i<line_vec.size();i++){
std::cout << line_vec[i] << std::endl;
}
std::cout << "The size of the line_vector is : " << line_vec.size() << std::endl;
#endif
//=========================================================================
//Now splitting line by semicolon for customer names and product name seperation
std::vector<std::string> customer_list;
std::vector<std::string> product_list;
for (int i=0; i<line_vec.size();i++)
{
split_string(line_vec[i], customer_list, product_list);
}
#ifdef DEBUG
std::cout <<"=======================================================================" <<std::endl;
std::cout <<"\nPrinting out contents of the customer_list " <<std::endl;
std::cout <<"=======================================================================" <<std::endl;
for (int i=0; i<customer_list.size();i++){
std::cout << customer_list[i] << "\n\n" << std::endl;
}
std::cout << "The size of the customer_list vector is : " << customer_list.size() << std::endl;
std::cout <<"=======================================================================" <<std::endl;
std::cout <<"\nPrinting out contents of the product_list " <<std::endl;
std::cout <<"=======================================================================" <<std::endl;
for (int i=0; i<product_list.size();i++){
std::cout << product_list[i] << "\n\n" << std::endl;
}
std::cout << "The size of the line_vector vector is : " << product_list.size() << std::endl;
#endif
//comma seprating the sting to get a list of customer names and product names
std::vector < std::vector < std::string > > customer_name;
std::vector < std::vector < std::string > > product_name;
for(int i =0; i< customer_list.size(); i++)
{
comma_seprate(customer_list[i],customer_name,i);
//comma_seprate(product_list[i],product_name,i);
}
}
答案 0 :(得分:0)
这意味着a[i]
中没有任何内容,它会超出。
你有一个向量载体
std::vector < std::vector<std::string> >& a
所以你要推回第二个向量中的元素
std::vector < std::vector<std::string> >& a
// ^^^^^^^^^^^^^^^^^^^^^^^^ Inside this one here
但是另一个矢量它仍然是空的
std::vector < std::vector<std::string> >& a
//^^^^^^^^^^^ that one is empty
所以如果你a[i]
崩溃是正常的......因为它是空的。
你可以做的是先创建内部向量。
while(std::getline(ss, token, ','))
{
std::vector<std::string> inner_vector;
inner_vector.push_back(token);
a.push_back(inner_vector); //this is the line causing segmentation fault at runtime
std::cout << token << std::endl;
j++;
}