我不太了解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());
}
答案 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条)并提供了他们的 上课不是工会。
在使用指针的其他情况下,操作符未定义。