如何基于另一个向量的信息将向量中的元素添加在一起 [英] How to add elements in vector together based on info from another vector

查看:70
本文介绍了如何基于另一个向量的信息将向量中的元素添加在一起的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个向量结构,一个包含每个的代码和成本,另一个仅是包含请求的代码和totalCost(待计算)的订单

I have two vector structs, one contains the codes and cost for each, and another is just orders that contains requested codes and totalCost (to be calculated)

vector零件(代码,成本);

vector parts(codes, cost);

矢量订单(代码,totalCost); // totalCost设置为0;

vector orders(codes, totalCost); //totalCost set to 0;

其中零件矢量包含类似('A',10,'B',20);

where the parts vector contains something like ('A', 10, 'B', 20);

其中A和B为部分,A的成本为10,B的成本为20。

Where A and B are parts, 10 is cost for A, 20 cost for B.

并且订单向量包含诸如A的订单,B,C或只是A,B说我们收到了零件A和零件B的订单。

and the orders vector contains orders such as A,B,C or just A,B Say we receive an order of parts A and B.

我们如何根据零件和存储中的成本将这两个零件相加

how do we go about adding these two based on cost from parts and storing the result in a new int that we gonna use later to add to the vector struct orders (totalCost).

我尝试了几个小时,我想我需要使用一个新的int的结果,稍后再将它添加到向量struct订单中(totalCost)。 std :: transform,也许std :: accumulate?只是不确定如何将两者放在一起...

I was trying for several hours, I think I need to use std::transform and maybe std::accumulate? just not sure how to put the two together...

这是我到目前为止所写的内容:

This is what I have written so far:

int totalCost;
for(auto i : customers){
    for(auto x : parts){
      totalCost = accumulate(i.partsList.begin(), i.partsList.end(), ???);
      //then need to store cost for each order for use later
}

我也尝试过:

void test(){
    int cost;
    for(unsigned i =0; i < customers.size(); i++){
        for(unsigned x=0; x < partsVec.size(); x++){
            for(unsigned z=0; z < customers.at(i).partsList.size(); z++){

                if(partsVec.at(x).code == customers.at(i).partsList.at(z)){
                    cost += partsVec.at(x).cost;
                    customers.at(i).cost= cost;
                }
            }
        }
    }
      for(auto i : customers){
        cout << i.cost<< endl;
    }
}

此输出为:

40 //this is correct.

80 //this is incorrect, needs to be 40 as both customers have ordered same parts!

如您所见,这一直在推波助澜,我想不出办法阻止它。

As you can see, this keeps incriminating and I can't figure out a way to stop it.

我要做的是,根据零件向量中的信息获取partsList中所有零件的总成本。客户向量中有另一个字符向量,称为partsList,然后可以使用累加或其他算法将每个订单的totalCost更改为从上面获得的值

what I am trying to do, is get the total cost of all parts in partsList based on info from the parts vector. Customers vector has another vector of chars in it called partsList, then I can change the totalCost of each order to value obtained from above using accumulate or some other algorithm

推荐答案

尝试如下操作:

struct Part
{
    char code;
    double cost;

    Part(char code, double cost)
        : code(code), cost(cost)
    {
    }
};

std::vector<Part> parts;

double costOfPart(char code)
{
    for(const Part &part : parts)
    {
        if (part.code == code)
            return part.cost;
    }
    return 0.0;
}

struct OrderItem
{
    char partCode;
    size_t quantity;

    OrderItem(char partCode, size_t quantity)
        : partCode(partCode), quantity(quantity)
    {
    }
};

struct Order
{
    int code;
    std::vector<OrderItem> items;

    Order(int code)
       : code(code)
    {
    }

    void addItem(char partCode, size_t quantity)
    {
        for (OrderItem &item : items)
        {
            if (item.partCode == partCode)
            {
                item.quantity += quantity;
                return;
            }
        }
        items.push_back(OrderItem(partCode, quantity));
    }

    double totalCost() const
    {
        double total = 0.0;
        for (const OrderItem &item : items)
        {
            total += (costOfPart(item.partCode) * item.quantity);
        }
        // TOOD: fees, taxes, discounts, etc...
        return total;
    }
};

std::vector<Order> orders;

double costOfAllOrders()
{
    double total = 0.0;
    for(const Order &order : orders)
    {
        total += order.totalCost();
    }
    return total;
}

double costOfOrder(int orderCode)
{
    for(const Order &order : orders)
    {
        if (order.code == orderCode)
            return order.totalCost();
    }
    return 0.0;
}

...

parts.push_back(Part('A', 10.0));
parts.push_back(Part('B', 20.0));

...

Order order(12345);
order.addItem('A', 1);
orders.push_back(order);

...

double costOfOneOrder = costOfOrder(12345);
double totalCostOfOrders = costOfAllOrders();
...

或者,如果您真的想使用 std :: accumulate(),那么您可以执行以下操作:

Or, if you really want to use std::accumulate(), then you can do something like this:

#include <algorithm>
#include <numeric>

struct Part
{
    char code;
    double cost;

    Part(char code, double cost)
        : code(code), cost(cost)
    {
    }
};

std::vector<Part> parts;

double costOfPart(char code)
{
    auto iter = std::find_if(parts.begin(), parts.end(),
        [=](Part &part){ return part.code == code; }
    );
    if (iter != parts.end())
        return iter->cost;
    return 0.0;
}

struct OrderItem
{
    char partCode;
    size_t quantity;

    OrderItem(char partCode, size_t quantity)
        : partCode(partCode), quantity(quantity)
    {
    }
};

struct Order
{
    int code;
    std::vector<OrderItem> items;

    Order(int code)
       : code(code)
    {
    }

    void addItem(char partCode, size_t quantity)
    {
        auto iter = std::find_if(items.begin(), items.end(),
            [=](OrderItem &item){ return item.partCode == partCode; }
        );
        if (iter != items.end())
            iter->quantity += quantity;
        else
            items.emplace_back(partCode, quantity);
    }

    double totalCost() const
    {
        double total = std::accumulate(items.begin(), items.end(), 0.0,
            [](double totalSoFar, const OrderItem &item) {
                return totalSoFar + (costOfPart(item.partCode) * item.quantity);
            }
        );
        // TOOD: fees, taxes, discounts, etc...
        return total;
    }
};

std::vector<Order> orders;

double costOfAllOrders()
{
    return std::accumulate(orders.begin(), orders.end(), 0.0,
        [](double totalSoFar, const Order &order){
            return totalSoFar + order.totalCost();
        }
    );
}

double costOfOrder(int orderCode)
{
    auto iter = std::find_if(orders.begin(), orders.end(),
        [=](Order &order){ return order.code == orderCode; }
    );
    if (iter != orders.end())
        return iter->totalCost();
    return 0.0;
}

...

parts.emplace_back('A', 10.0);
parts.emplace_back('B', 20.0);

...

Order order(12345);
order.addItem('A', 1);
orders.push_back(order);

...

double costOfOneOrder = costOfOrder(12345);
double totalCostOfOrders = costOfAllOrders();
...






更新::根据您添加的代码,您正在循环所有错误。您需要的是这样的东西:


Update: Based on the code you have added, you are looping all wrong. You need something more like this instead:

auto partCost = [&](char code) -> int {
    for(auto &p : partsVec) {
        if (p.code == code)
            return p.cost;
    }
    return 0;
}

int totalCost = 0;
for(auto &c : customers){
    totalCost += accumulate(c.partsList.begin(), c.partsList.end(), 0,
        [&](int totalSoFar, char code) {
            return totalSoFar + partCost(code);
        }
    );
}

或者,仅使用普通循环:

Or, just using plain loops:

void test(){
    int cost = 0;
    for(unsigned i = 0; i < customers.size(); i++) {
        auto &c = customers[i];
        for(unsigned x = 0; x < c.partsList.size(); x++) {
            auto partCode = c.partsList[x];
            for(unsigned z = 0; z < partsVec.size(); z++) {
                auto &p = partsVec[z];
                if (p.code == partCode) {
                    cost += p.cost;
                    break;
                }
            }
        }
    }
    cout << cost << endl;
}

这篇关于如何基于另一个向量的信息将向量中的元素添加在一起的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆