这个向量的值是按哪个值排序的?

时间:2014-04-03 22:40:40

标签: c++ sorting vector

我不太了解C,但我想了解这段代码的工作原理。我的问题是我真的不明白在这种情况下如何对矢量进行排序。它如何知道必须对哪个值进行排序?

#include "stdafx.h"
#include "LatticeLocation.h"
#include "Body.h"
#include "Region.h"
#include "Particle.h"
#include <queue>

void LatticeLocation::CalculateNeighborhood()
{
        sort(neighborhood.begin(), neighborhood.end());
}

这是排序的Vector:

std::vector<LatticeLocation*> neighborhood; 

这里是LatticeLocation.h文件:

#pragma once
#include "Point3.h"
#include <vector>

class Summation;
class Body;
class Chunk;
class Region;
class Particle;
class Cell;

class LatticeLocation
{
public:
    Body *body;
    Point3 index;
    Cell *cell;                 // Primarily for rendering... we keep it in the physics engine to make things simple for users

    // Properties
    bool regionExists;          // Set to false if the region is identical to another region or otherwise turned off
    bool edge;                  // Whether this is an edge - i.e., has less than the full number of immediateNeighbors

    // The IMMEDIATE immediateNeighbors
    std::vector<LatticeLocation*> immediateNeighbors;
    LatticeLocation *immediateNeighborsGrid[3][3][3];   // Same as the pointers in the array, just indexed differently

    // Generated
    std::vector<LatticeLocation*> neighborhood;         // All particles up to w links away

    // The elements centered/living here
    Particle *particle;
    Region *region;                         // MAY BE NULL
    std::vector<Summation*> sums[2];        // Sums that live here (not necc. centered). sums[0] = xSums, sums[1] = xySums

    // Used in some algorithms
    unsigned int touch;
    float touchFloat;

    void CalculateNeighborhood();           // Will use a BFS to fill in neighborhood. Also sets regionExists
};

stdafx.h中:

#pragma once

#include <string>
#include <sstream>

#include <math.h>
#include <fvec.h>       // SSE
#include <vector>
#include <set>
#include <string>

#include <stdio.h>
#include <stdlib.h>
#include <algorithm>

我找到的所有排序示例都使用&#34; std:sort&#34;而不只是&#34;排序&#34;所以也许它不是这里使用的标准排序函数。我在所有源代码文件中搜索了这样的排序函数,但没有。或者是否有可能存在一个标准的排序函数,它自动发现LatticeLocation包含一个可排序的值(Point3索引,因为Point3重载了&lt;运算符)并按该值对其进行排序?

编辑:

事实证明,我从上面的剪辑中留下了一些重要的代码。这应该更有意义

#include "stdafx.h"
#include "LatticeLocation.h"
#include "Body.h"
#include "Region.h"
#include "Particle.h"
#include <queue>

    void LatticeLocation::CalculateNeighborhood()
    {
        neighborhood.clear();
        neighborhood = immediateNeighbors;
        sort(neighborhood.begin(), neighborhood.end());
    }

2 个答案:

答案 0 :(得分:3)

如果您要排序的向量由指针 LatticeLocation*组成,那么您获得的排序就没有意义了:您只是对指针进行排序(即您正在对基于的排序对象)他们在内存中占用的特定“随机”位置),而不考虑LatticeLocation类的语义

您可能希望使用例如 ad hoc 自定义排序条件。 lambda 作为std::sort()的第三个参数:

sort(neighborhood.begin(), neighborhood.end(), [](const LatticeLocation* a, 
                                                  const LatticeLocation* b) {
    // Implement proper code to specify if '*a' is less than '*b'
    .... 
});

答案 1 :(得分:-1)

它只是根据运算符LatticeLocation*比较指针<。实际上,如果向量中的指针不指向某个数组的元素,则此代码具有未定义的行为,因为您可能无法比较不指向同一数组的元素的指针。

例如在C标准中有足够清楚的

  

在所有其他情况下,行为未定义

在C ++标准中,运算符的定义方式如下

  

3比较指向对象的指针如下: - 如果是两个   指针指向同一个数组的不同元素,或者指向   其子对象,指向具有较高元素的元素   下标比较大。 - 如果一个指针指向一个元素   一个数组或其子对象,另一个指针指向一个   超过数组的最后一个元素,后一个指针进行比较   更大。 - 如果两个指针指向不同的非静态数据成员   同一个对象,或者这些成员的子对象,递归地,   指向后来声明的成员的指针比较大,提供了两个   成员具有相同的访问控制(第11条)并提供了他们的   上课不是工会。

在使用指针的其他情况下,操作符未定义。