以下C ++代码行是什么意思?

时间:2016-04-03 21:18:17

标签: c++ pointers data-structures struct

以下代码块来自实现队列的C ++程序。我知道结构,类和指针等,但我不使用struct很多,所以它让我很难理解*front = NULL,*rear = NULL,*p = NULL,*np = NULL;的含义。是否声明了这些节点类型指针并将其设置为默认值NULL?如果我错了并请您解释,请纠正我。



struct node
{
    int data;
    node *next;
}*front = NULL,*rear = NULL,*p = NULL,*np = NULL;




2 个答案:

答案 0 :(得分:3)

相同
val input = sqlContext.createDataFrame(Seq(
  Record(1, "Prod_1"),
  Record(2, "Prod_1"),
  Record(3, "Prod_1"),
  Record(4, "Prod_2"),
  Record(5, "Prod_3"),
  Record(6, "Prod_3"),
  Record(7, "Prod_2"),
  Record(8, "Prod_3"),
  Record(9, "Prod_1"),
  Record(10, "Prod_1"),
  Record(11, "Prod_4")
))

input.registerTempTable("input")

// Step 1: find "nextShiftId" for each record
val withBlockId = sqlContext.sql(
  """
    |SELECT FIRST(a.id) AS id, FIRST(a.productId) AS productId, MIN(b.id) AS nextShiftId
    |FROM input a
    |LEFT JOIN input b ON a.productId != b.productId AND a.id < b.id
    |GROUP BY a.id
  """.stripMargin)

withBlockId.show()
// prints:
// +---+---------+-----------+
// | id|productId|nextShiftId|
// +---+---------+-----------+
// |  1|   Prod_1|          4|
// |  2|   Prod_1|          4|
// |  3|   Prod_1|          4|
// |  4|   Prod_2|          5|
// |  5|   Prod_3|          7|
// |  6|   Prod_3|          7|
// |  7|   Prod_2|          8|
// |  8|   Prod_3|          9|
// |  9|   Prod_1|         11|
// | 10|   Prod_1|         11|
// | 11|   Prod_4|       null|
// +---+---------+-----------+

// Step 2: group by "productId" and "nextShiftId"
val resultRdd = withBlockId.rdd
  .groupBy(r => (r.getAs[String]("productId"), r.getAs[Int]("nextShiftId")))
  // sort by nextShiftId to get the order right before adding index
  .sortBy {
     case ((prodId, 0), v) => Long.MaxValue // to handle the last batch where nextShiftId is null
     case ((prodId, nextShiftId), v) => nextShiftId
   }
  // zip with index (which would be the "unique id") and flatMap to just what we need:
  .values
  .zipWithIndex()
  .flatMap { case (records, index) => records.map(r => (r.getAs[String]("productId"), index+1))}

// transform back into DataFrame:
val result = sqlContext.createDataFrame(resultRdd)

result.show()
// prints:
// +------+---+
// |    _1| _2|
// +------+---+
// |Prod_1|  1|
// |Prod_1|  1|
// |Prod_1|  1|
// |Prod_2|  2|
// |Prod_3|  3|
// |Prod_3|  3|
// |Prod_2|  4|
// |Prod_3|  5|
// |Prod_1|  6|
// |Prod_1|  6|
// |Prod_4|  7|
// +------+---+

答案 1 :(得分:2)

这意味着与此相同:

struct node
{
    int data;
    node *next;
};

node *front = NULL;
node *rear = NULL;
node *p = NULL;
node *np = NULL;

这绝对不是一种好的风格。

顺便说一句,如果node是一个类,这也可以。 struct基本上是一个类,默认情况下所有元素都是公共的。

另一个建议:C ++ 11有一个特定的关键字nullptr用于初始化指针。这更清楚地表达了正在发生的事情。 NULL只是一个扩展为0的预处理器宏。