查找 min_element 时填充结构,C++
fill structure while finding min_element, C++
我想在找到最小元素的同时填充一些结构。请找到下面的代码
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;
现在我有两个任务:
- 我需要从结构 V 中找到最小元素。
填写结构cart,直接依赖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);
}
现在这个实现有一个明显的问题。
有两个循环。一个用于填充结构,另一个用于查找最小元素(std::min_element()
必须有一个循环来遍历所有值)。我正在争取几毫秒的改进。所以这不是一个好的代码。而且,这好像是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,但没有成功。
所以请建议。
您似乎想要这样的东西:
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
我想在找到最小元素的同时填充一些结构。请找到下面的代码
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;
现在我有两个任务:
- 我需要从结构 V 中找到最小元素。
填写结构cart,直接依赖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); }
现在这个实现有一个明显的问题。
有两个循环。一个用于填充结构,另一个用于查找最小元素(std::min_element()
必须有一个循环来遍历所有值)。我正在争取几毫秒的改进。所以这不是一个好的代码。而且,这好像是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,但没有成功。
所以请建议。
您似乎想要这样的东西:
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