找到min_element时填充结构,C ++

时间:2016-01-01 19:18:52

标签: c++ boost vector iterator std

我想在找到最小元素时填充一些结构。 Pl找到下面的代码

tyoedef struct Point
{
    double x, y;
}Point;

我有vector of points - std::vector<Point> V,其中我有几千分。

我有另一个结构

typedef struct cart
{
    Point pt;
    double val_1; // computed using only Pt
    double val_2; // computer using only Pt
}cart;

现在我有两个任务:

  1. 我需要从结构V中找到最小元素。
  2. 填充结构购物车,该购物车直接依赖于V。

    我可以使用以下代码执行此操作。

    std::vector<cart> vCart;
    for(unsigned i = 0; i < V.size(); ++i)
    {
        cart thsElement;
        thsElement.pt = V[i];
        thsElement.val_1 = compute_val_1(V[i]);
        thsElement.val_2 = compute_val_2(V[i]);
        vCart.push_back(thsElement)
    }
    
    auto it = std::min_element(vCart.begin(), vCart.end(), lex_sort);
    
    bool lex_sort(cart const &a, cart const &b)
    {
        if(a.pt.x < b.pt.x) return true;
        if(a.pt.x == b.pt.x) return (a.pt.y < b.pt.y);
    }
    
  3. 现在这个实现存在明显的问题。

    有两个循环。一个用于填充结构,另一个用于查找min元素(std::min_element()必须有一个循环来迭代所有值)。我正在战斗几毫秒&#39;改进。所以这不是一个好的代码。而且,这似乎是C_style

    所以我提出了以下代码。

        std::vector<cart> vCart;
        std::iterator <vCart> st_ite;
    
        auto it = std::min_element(V.begin(), V.end(), boost::bind(FillStruct_LexSort, st_ite, _1, _2)); // V is a vector of Point
    
        bool FillStruct_LexSort(std::insert_iterator< std::vector<Cart>> vcpInput, const Point &a, const Point &b)
        {
            Cart thsPt;
            if(a.x() < b.x())
            {
                thsPt.pt = b;
                thsPt.val_1 = compute_val_1(b);
                thsPt.val_2 = compute_val_2(b);
                (*vcpInput++) = (thsPt);
                return true;
            }
            if (a.x() == b.x())
            {
                if(a.y() < b.y())
                {
                    thsPt.pt = b;
                    thsPt.val_1 = compute_val_1(b);
                    thsPt.val_2 = compute_val_2(b);
    
                    (*vcpInput++) = (thsPt);
                    return true;
                }
            }
    
            thsPt.pt = a;
            thsPt.val_1 = compute_val_1(b);
            thsPt.val_2 = compute_val_2(b);
    
            (*vcpInput++) = (thsPt);
            return false;
        }
    

    现在,问题是 - 我得到分段错误。我不知道如何使用迭代器插入值。我尝试将引用传递给vCart,但在调用min_element(..)后vCart为空。我甚至尝试过insert_iterator,但没有成功。

    所以我建议。

1 个答案:

答案 0 :(得分:3)

看起来你想要这样的东西:

bool lex_sort(const Point& lhs, const Point& rhs)
{
    return std::tie(lhs.x, lhs.y) < std::tie(rhs.x, rhs.y);
}

然后

auto it = std::min_element(V.begin(), V.end(), &lex_sort);
if (it == V.end()) {
    // V is empty.
} else {
    Cart thsPt;
    thsPt.pt = it;
    thsPt.val_1 = compute_val_1(*it);
    thsPt.val_2 = compute_val_2(*it);
    return thsPt;
}

请注意,如果val_1 / val_2始终取决于pt,您可以为Cart添加Point

的构造函数