c++ set 求后继
时间: 2024-02-17 12:59:06 浏览: 134
C++中的set是一种关联容器,它照特定的排序规则存储唯的元素。set中的元素默认按照升序进行排序。
要求set中某个元素的继,可以使用set的成员函数upper()。该函数返回一个迭代器,指向大于给值的第一个元素。如果没有大给定值的元素,则返回set的end()迭代器。
下面是一个示例代码,演示如何使用set求后继:
```cpp
<iostream>
#include <set>
int main() std::set<int> mySet = {10, 20, 30, 40, 50};
int value = 25;
auto it = mySet.upper_bound(value);
if (it != mySet.end()) {
std::cout << "后继元素为: " << *it << std::endl;
} else {
std::cout << "没有找到后继元素" << std::endl;
}
return 0;
}
```
在上面的示例中,我们创建了一个包含一些整数的set。然后,我们使用upper_bound()函数来查找大于给定值25的第一个元素。如果找到了后继元素,则输出该元素的值;否则输出"没有找到后继元素"。
相关问题
c++实现求文法的选择集合
要实现求文法的选择集合,首先需要了解文法的定义和选择集的概念。
文法是由若干个产生式组成的,每个产生式包含一个非终结符和一个由终结符和非终结符组成的串。选择集是对于一个非终结符,它可以推出的所有串的首字符的集合。具体的计算方法如下:
1. 对于每个产生式A->α,如果α是以非终结符B开头的串,那么将FIRST(B)中的所有元素添加到FOLLOW(A)中。
2. 对于每个产生式A->α,如果α可以推导出空串,那么将FOLLOW(A)中的所有元素添加到FOLLOW(B)中。
3. 对于每个产生式A->α,如果α可以推导出非空串,那么将FIRST(α)中的所有元素添加到FOLLOW(A)中。
其中,FIRST(α)表示串α的首字符集合,FOLLOW(A)表示非终结符A的选择集合。
C++实现的伪代码如下:
```c++
// 计算文法G的选择集合
void compute_select_sets(Grammar G) {
// 初始化所有非终结符的选择集
for (auto &N : G.nonterminals) {
N.select_set.clear();
}
// 计算选择集
for (auto &P : G.productions) {
// 1. 计算 FOLLOW(A)
for (auto it = P.rhs.begin(); it != P.rhs.end(); ++it) {
if (it == P.rhs.end() - 1) {
// 最后一个符号
P.lhs.select_set.insert(P.lhs.select_set.end(),
FOLLOW(P.lhs).begin(),
FOLLOW(P.lhs).end());
} else if (is_nonterminal(*it)) {
// 非终结符
auto next_it = it + 1;
while (next_it != P.rhs.end() && is_nullable(*next_it)) {
// 如果后继符号可以推导出空串,继续向后查找
P.lhs.select_set.insert(P.lhs.select_set.end(),
FIRST(*next_it).begin(),
FIRST(*next_it).end());
++next_it;
}
if (next_it == P.rhs.end()) {
// 如果后继符号为空,将 FOLLOW(A) 添加到选择集中
P.lhs.select_set.insert(P.lhs.select_set.end(),
FOLLOW(P.lhs).begin(),
FOLLOW(P.lhs).end());
} else {
// 如果后继符号为终结符,将其添加到选择集中
P.lhs.select_set.insert(*next_it);
}
} else {
// 终结符
P.lhs.select_set.insert(*it);
break;
}
}
// 2. 计算 FOLLOW(B)
for (auto &N : G.nonterminals) {
if (N == P.lhs) {
continue;
}
for (auto it = N.productions.begin(); it != N.productions.end(); ++it) {
auto rhs_it = std::find(it->rhs.begin(), it->rhs.end(), P.lhs);
if (rhs_it == it->rhs.end()) {
continue;
}
auto next_it = rhs_it + 1;
while (next_it != it->rhs.end() && is_nullable(*next_it)) {
N.select_set.insert(N.select_set.end(),
FIRST(*next_it).begin(),
FIRST(*next_it).end());
++next_it;
}
if (next_it == it->rhs.end()) {
N.select_set.insert(N.select_set.end(),
FOLLOW(N).begin(),
FOLLOW(N).end());
} else {
N.select_set.insert(*next_it);
}
}
}
// 3. 计算 FIRST(α)
if (is_nullable(P.rhs)) {
P.lhs.select_set.insert(FOLLOW(P.lhs).begin(), FOLLOW(P.lhs).end());
} else {
P.lhs.select_set.insert(FIRST(P.rhs).begin(), FIRST(P.rhs).end());
}
}
}
```
C++中,set容器迭代器++操作的底层原理
在 C 语言中没有 set 容器,我猜测你可能是在问 C++ 中的 set 容器迭代器操作的底层原理。
set 容器是基于红黑树实现的,其迭代器也是基于红黑树实现的。在 set 容器中,每个元素都对应着一棵红黑树中的节点。set 容器的迭代器实际上就是红黑树中的迭代器,它是一个指向节点的指针。
在 set 容器中,迭代器支持的操作包括:
1. 前进和后退:++it、--it、it++、it--
2. 解引用:*it、it->m
3. 比较:==、!=、<、>、<=、>=
这些操作的底层实现都是基于红黑树的遍历和查找算法实现的。例如,前进和后退操作实际上是基于红黑树中节点的前驱和后继节点实现的。解引用操作实际上是返回节点中存储的元素值。比较操作实际上是比较两个节点在红黑树中的位置关系。
总的来说,set 容器的迭代器操作的底层原理是基于红黑树的遍历和查找算法实现的。
阅读全文