【问题标题】:Can we use pair as the name for a vector?我们可以使用pair作为向量的名称吗?
【发布时间】:2021-04-26 08:19:54
【问题描述】:

我遇到了一个表达式:vector<int> pair(n)。由于pair本身是一个内置结构,我们可以将它用作c++中的变量名吗?为什么?

【问题讨论】:

标签: c++ variables std-pair


【解决方案1】:

由于 pair 本身是一个内置结构,我们可以在 c++ 中将其用作变量名吗?为什么?

这是不正确的。 Standard Template Library 提供了一个class template called "pair",但它不是 内置 类型,此外,“pair”在 C++ 语言中既不是关键字也不是保留字。

此外,前面提到的“pair”模板实际上是在std 命名空间中提供的(在<utility> 标头中),因此它的完全限定名称是std::pair。因此,除非您既是#include <utility>(显式或隐式)又是using std::pair;(或using namespace std;——但see here),您可以使用名称“pair”作为标识符,就像任何其他非保留字。


事实上,即使你#include <utility>using std::pair;(或using namespace std;),你也可以仍然使用"pair" 作为标识符,如 comment by chris 所述。

【讨论】:

  • 我会说“C++ 标准库”而不是“标准模板库”。
  • 如果你没有包含 ,那并不一定意味着 pair 没有在 std 命名空间中定义。您包含的其他一些标准标头可能包含 或定义对。例如,unordered_map 当然可以。
  • @AyxanHaqverdili 请注意,我提到了包含该标头,“显式或隐式”。据我所知,如果定义了std::pair,它将在该标头中定义(但我需要彻底检查标准,以确保)。
  • @AdrianMole 很可能有第三个标头只定义pair (而不是 定义的其他内容),并且标头( 和您使用的其他一些标头)都包括那个。
  • @AyxanHaqverdili This Draft C++17 Standard 强烈建议(第 23.1 节,表 34)在 <utility> 标头中定义“对”。
【解决方案2】:

是的,你可以。标准库中的模板称为std::pairstd::vector。它们不是内置的,因为它们不是语言的一部分,而是标准库的一部分。因此这不是问题:

#include <vector>  
std::vector<int> pair(n);

可以使用 using 指令删除 std:: 前缀:

#include <vector>
using std::vector;
vector<int> pair(n);

常用的也是using namespace std;

#include <vector>
using namespace std;
vector<int> pair(n);

不过,一旦将完整的命名空间拉入作用域,代码可能会相当混乱。

阅读Why is “using namespace std;” considered bad practice? 并尽量避免它。并给出适当的名称。 std::pair 比较常见,所以你最好为向量选择一个更好的名字,它肯定不是pair

【讨论】:

    【解决方案3】:

    std::pair 不是“内置结构”。它是标准库中的限定名称。既然是合格的,一般不会和你自己的名字冲突。

    这正是命名空间被添加到 C++ 语言中的原因。

    【讨论】:

      猜你喜欢
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 2018-04-23
      相关资源
      最近更新 更多