我有以下程序,如果我在程序的main函数中实现算法,它工作正常。如果我使用我的算法的另一个功能,我不能使用它,我不知道问题是什么。我应该使用一些指针来解决问题吗?有人可以帮帮我吗?提前谢谢!
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
class Map
{
public:
float x;
float y;
float theta;
};
bool operator<(const Map& x, const Map& y)
{
return x.theta < y.theta;
}
当我在main函数中实现它时,我的排序和过滤算法工作正常:
int main()
{
Map mapArray[10] = {{1, 5, 1}, {9, 2, -0.8}, {3, 0, -6.5}, {5, 7, -4.3}, {1, -4, -0.99}, {6, 4, -0.66}, {10, 8, 6}, {0, 9, 1.1}, {6, 2, 4}, {3, 5, -0.8}};
vector<Map> resultMap;
int mapSize = (sizeof mapArray / sizeof mapArray[0]);
float piHalf = 1.57;
// Sort the map
std::sort(mapArray + 0, mapArray + mapSize);
// Filter the result
for( int a = 0; a < mapSize; a = a + 1 )
{
if(mapArray[a].theta >-piHalf && mapArray[a].theta<piHalf) {
resultMap.push_back(mapArray[a]);
}
}
// Print each theta-data for test the program
cout << "Data:" << resultMap.size()<<endl;
for( unsigned int i = 0; i < resultMap.size(); i = i + 1 )
{
cout << "Data:" << resultMap[i].theta<<endl;
}
return 0;
}
但是,如果我使用我的排序和过滤算法的功能,整个事情就不起作用了,结果我得到了一个0大小的矢量。我的功能实现:
vector<Map> sortAndFilterMap(Map mapArray[]) {
// Init variables
vector<Map> resultMap;
int mapSize = (sizeof mapArray / sizeof mapArray[0]);
float piHalf = 1.57;
// Sort the map
std::sort(mapArray + 0, mapArray + mapSize);
// Filter the result
for( int a = 0; a < mapSize; a = a + 1 )
{
if(mapArray[a].theta >-piHalf && mapArray[a].theta<piHalf) {
resultMap.push_back(mapArray[a]);
}
}
return resultMap;
}
我如何在主要使用它:
int main() {
Map mapArray[10] = {{1, 5, 1}, {9, 2, -0.8}, {3, 0, -6.5}, {5, 7, -4.3}, {1, -4, -0.99}, {6, 4, -0.66}, {10, 8, 6}, {0, 9, 1.1}, {6, 2, 4}, {3, 5, -0.8}};
vector<Map> resultMap;
resultMap = sortAndFilterMap(mapArray);
// Print each theta-data for test the program
cout << "Data:" << resultMap.size()<<endl;
for( unsigned int i = 0; i < resultMap.size(); i = i + 1 )
{
cout << "Data:" << resultMap[i].theta<<endl;
}
return 0;
}
编辑:我很抱歉,我没有很好地解释我的错误。错误如下:正如您所看到的,在主函数的末尾,我打印出了已过滤和排序的地图。在第一个解决方案中,当我在主循环中进行实现时,我得到了打印的预期值。当我创建一个函数时,也应该打印出“theta”值,但是我没有打印任何内容。在for循环之前,我“cout”resultMap的大小,但是我得到0而不是6.
答案 0 :(得分:4)
int mapSize = (sizeof mapArray / sizeof mapArray[0]);
此行仅适用于极少数情况。说你不应该这样做更容易。将数组的长度作为额外参数传递,你是安全的:
std::vector<Map> sortAndFilterMap(Map mapArray[], int mapSize)
或者,您可以在任何地方使用std::vector<Map>
并一起删除原始数组。
答案 1 :(得分:2)
int mapSize = (sizeof mapArray / sizeof mapArray[0]);
的结果在两种情况下有所不同:
vector<Map> sortAndFilterMap(Map mapArray[])
中时:数组衰变为指向Map对象的指针(该函数不再知道mapArray的大小); sizeof mapArray
返回此指针的大小(4或8个字节,具体取决于您是在32位还是64位系统上)。因此结果是(4 or 8) / (sizeof float * 3) = 0
。 for循环将在第一次迭代时立即中断,函数返回一个空向量。答案 2 :(得分:1)
我不想鼓励使用原始C数组,除了非常特殊情况外,基本上不应该使用它。但是,如果真的必须,你可以使用它:
template<size_t mapSize>
vector<Map> sortAndFilterMap(Map (&mapArray)[mapSize]) {
对数组(&mapArray)
的引用可以使用模板推导来推断数组的大小。在此mapSize
将具有正确的大小。
无论如何,默认情况下只使用vector
而不是C数组。