C ++ vector<'Object's>返回类型函数实现

时间:2015-01-27 15:11:53

标签: c++

我有以下程序,如果我在程序的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.

3 个答案:

答案 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]);的结果在两种情况下有所不同:

  1. 当它在主要时:结果是10,这是你所期望的。
  2. 当它在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数组。