std::erase_if | c++20 模拟

include

#include <utility>
#include <iostream>
#include <string>
#include <iterator>

Test Demo

template< std::size_t _ArrayLength, typename _Ty >
std::ostream& operator<<( std::ostream& out, _Ty ( &array )[ _ArrayLength ] ){
	std::copy( std::begin( array ),
			   std::end( array ),
			   std::ostream_iterator< _Ty >( out, "|") );
	return out;
}
int main( void ){
	char charSeq[ 10 ] = "aaabbbccc";
	puts( R"PRIM(charSeq before remove letter 'c' )PRIM" );
	std::cout << charSeq << std::flush;
	std::endl( std::cout );
	erase_if(charSeq,
			[&]( char& c )->bool
			{ return ( c == 'b' ); },
			 '*');
	puts( R"PRIM(charSeq after remove letter 'c' )PRIM" );
	std::cout << charSeq << std::flush;
	std::endl( std::cout );
	
	int intSeq[ 6 ] = { 1, 1, 2, 2, 3, 3, };
	puts( R"PRIM(intSeq before remove number 2 )PRIM" );
	std::cout << intSeq << std::flush;
	std::endl( std::cout );
	erase_if(intSeq,
				[&]( decltype(intSeq[0]) i )->bool
				{ return ( i == 2 ); },
				 -1);
	puts( R"PRIM(intSeq after remove number 2 )PRIM" );
	std::cout << intSeq << std::flush;
	std::endl( std::cout );
	return 0;
}

output result

erase_if( calling remove_if & range_set )

template < std::size_t _ArrayLength, typename _Ty, typename _UnaryPredicate >
std::size_t erase_if( _Ty ( &array )[ _ArrayLength ], _UnaryPredicate p, _Ty default_value ){
	std::size_t _Res { 0 };
	range_set( ( _Ty * )array +
					( _Res = remove_if( array, p )),
	           ( _Ty * )array + _ArrayLength,
			    default_value );
	return _Res;
}

remove_if ( calling find_if )

template < std::size_t _ArrayLength, typename _Ty, typename _UnaryPredicate >
std::size_t remove_if( _Ty ( &array )[ _ArrayLength ], _UnaryPredicate p ){
	std::size_t first = find_if( array, p),
				last   = _ArrayLength;
	if( first == last ) return last;
	for( std::size_t iter { first }; !( ++iter == last ); ){
		_Ty& __ref_ = *( ( _Ty *)array + iter );
		if( !p( __ref_ ) )
			array[ first++ ] = std::move( __ref_ );
	}
	return first;
}

 range_set

template < typename _Ty >
inline void range_set( _Ty *begIt, _Ty *endIt, _Ty val){
	while( !( begIt == endIt ) ) *begIt++ = val;
}

 find_if


template < std::size_t _ArrayLength, typename _Ty, typename _UnaryPredicate >
std::size_t find_if( _Ty ( &array )[ _ArrayLength ], _UnaryPredicate p ){
	std::size_t first { 0 };
	for( ; !( first == _ArrayLength )
	    && !p( *( ( _Ty *)array + first ) )
		; ++first ) {                     }
	return first;
}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
void MainWindow::moveAgvs_(){ timer =new QTimer(this); timer->start(100); connect(timer, &QTimer::timeout, this, &MainWindow::moveAgvs);} void MainWindow::moveAgvs() { Astar astar; std::vector<std::vector<Node*>> paths(agvs.size()); // 得到agv的路綫 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].getState() == false) { if (agvs[i].getLoad()){//如果是負載的狀態,則任務的起點到任務的終點 if (agvs[i].getCurrentX() == agvs[i].getEndX() && agvs[i].getCurrentY() == agvs[i].getEndY()) { agvs[i].setState(true); agvs[i].setLoad(false); task_to_agv(); } Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node1 = new Node(agvs[i].getEndX(), agvs[i].getEndY()); std::vector<Node*> path_to_end = astar.getPath(start_node, end_node1); path_to_end.erase(path_to_end.begin()); std::vector<Node*> path; path.insert(path.end(), path_to_end.begin(), path_to_end.end()); paths[i] = path;} else { //如果是空載的狀態,則行駛到任務的起點 //如果agv已經到達任務起點,變爲負載狀態 if (agvs[i].getCurrentX() == agvs[i].getStartX() && agvs[i].getCurrentY() == agvs[i].getStartY()) { agvs[i].setLoad(true); } Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); std::vector<Node*> path_to_start = astar.getPath(start_node, end_node); std::vector<Node*> path; path.insert(path.end(), path_to_start.begin() + 1, path_to_start.end()); paths[i] = path;} } //模擬小車行駛 for (int i = 0; i < agvs.size(); i++) { if (! paths[i].empty()) { Node* next_node = paths[i][0]; float speed = agvs[i].getSpeed(); float distance = sqrt(pow(next_node->x - agvs[i].getCurrentX(), 2) + pow(next_node->y - agvs[i].getCurrentY(), 2)); float time = distance / speed * 1000; QTimer::singleShot(time, this, &, i, next_node { agvs[i].setCurrentX(next_node->x); agvs[i].setCurrentY(next_node->y); std::cout << "AGV " << agvs[i].getid() << " current_x: " << agvs[i].getCurrentX() << " current_y: " << agvs[i].getCurrentY() <<std::endl; this->update(); }); } } } },給出代碼畫出agv獲取path的路綫
05-24
这段代码是一个在 Qt 框架下实现的 AGV(自动引导车)的运动控制函数。其中,通过 A* 算法实现 AGV 的路径规划并将规划的路径存储在 `std::vector<std::vector<Node*>> paths` 中。 以下是代码注释和画出 AGV 路线的过程: ```c++ void MainWindow::moveAgvs_() { timer = new QTimer(this); timer->start(100); // 每 100 毫秒更新一次 AGV 的位置 connect(timer, &QTimer::timeout, this, &MainWindow::moveAgvs); } void MainWindow::moveAgvs() { Astar astar; // 创建 A* 算法实例 std::vector<std::vector<Node*>> paths(agvs.size()); // 存储 AGV 的路径 // 得到 agv 的路线 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].getState() == false) { if (agvs[i].getLoad()) { // 如果是负载的状态,则任务的起点到任务的终点 if (agvs[i].getCurrentX() == agvs[i].getEndX() && agvs[i].getCurrentY() == agvs[i].getEndY()) { agvs[i].setState(true); agvs[i].setLoad(false); task_to_agv(); } Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node1 = new Node(agvs[i].getEndX(), agvs[i].getEndY()); std::vector<Node*> path_to_end = astar.getPath(start_node, end_node1); path_to_end.erase(path_to_end.begin()); // 删除起点 std::vector<Node*> path; path.insert(path.end(), path_to_end.begin(), path_to_end.end()); paths[i] = path; } else { // 如果是空载的状态,则行驶到任务的起点 // 如果 AGV 已经到达任务起点,变为负载状态 if (agvs[i].getCurrentX() == agvs[i].getStartX() && agvs[i].getCurrentY() == agvs[i].getStartY()) { agvs[i].setLoad(true); } Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); std::vector<Node*> path_to_start = astar.getPath(start_node, end_node); std::vector<Node*> path; path.insert(path.end(), path_to_start.begin() + 1, path_to_start.end()); // 删除起点 paths[i] = path; } } } // 模拟小车行驶 for (int i = 0; i < agvs.size(); i++) { if (!paths[i].empty()) { Node* next_node = paths[i][0]; float speed = agvs[i].getSpeed(); float distance = sqrt(pow(next_node->x - agvs[i].getCurrentX(), 2) + pow(next_node->y - agvs[i].getCurrentY(), 2)); float time = distance / speed * 1000; QTimer::singleShot(time, this, [&, i, next_node]() { agvs[i].setCurrentX(next_node->x); agvs[i].setCurrentY(next_node->y); std::cout << "AGV " << agvs[i].getid() << " current_x: " << agvs[i].getCurrentX() << " current_y: " << agvs[i].getCurrentY() << std::endl; this->update(); }); } } } ``` AGV 路线的绘制过程,可以在 Qt 的界面上通过 `paintEvent` 函数实现。在 `paintEvent` 函数内部,我们可以使用 `QPainter` 类绘制出 AGV 的路线。 ```c++ void MainWindow::paintEvent(QPaintEvent* event) { QPainter painter(this); QPen pen_black(Qt::black, 1, Qt::SolidLine); // 黑色画笔 QPen pen_red(Qt::red, 3, Qt::SolidLine); // 红色画笔 // 绘制 AGV for (int i = 0; i < agvs.size(); i++) { int x = agvs[i].getCurrentX(); int y = agvs[i].getCurrentY(); painter.setPen(pen_black); painter.drawEllipse(x - 5, y - 5, 10, 10); painter.drawText(x - 5, y - 5, QString::number(agvs[i].getid())); } // 绘制 AGV 的路径 for (int i = 0; i < agvs.size(); i++) { std::vector<Node*> path = paths[i]; if (!path.empty()) { painter.setPen(pen_red); Node* prev = path[0]; for (int j = 1; j < path.size(); j++) { Node* next = path[j]; painter.drawLine(prev->x, prev->y, next->x, next->y); prev = next; } } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XNB's Not a Beginner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值