为什么使用向量类我应该编写名称空间说明符std::vector
但是对于std::find
函数我可以省略std::
?有什么不同?两者都在std
命名空间中定义,对吗?
答案 0 :(得分:4)
为什么使用vector类我应该写命名空间说明符std :: vector但是对于std :: find函数我可以省略std ::?
一般来说,情况并非如此。
有什么区别。两者都在std命名空间中定义,对吗?
是的,原则上没有区别。根据C ++ 11标准的第17.6.1.1/2段:
除了宏,operator new和operator delete之外的所有库实体都在命名空间
std
中或在命名空间std
中嵌套的命名空间中定义。 [...]
但是,您必须记住Argument-Dependent Lookup规则允许例外:由于这种查找技术,没有必要显式指定函数的命名空间,因为名称将被查找在您提供给该函数的参数的命名空间中。
因此,如果函数恰好在与其任何参数相同的命名空间中定义,则编译器将找到它,即使其名称未使用它所属的命名空间限定:
namespace N
{
struct X { };
void foo(X) { }
}
int main()
{
N::X x;
foo(x); // OK
}
因此,如果您使用std::find()
命名空间中定义的类型实例的某些参数调用std
,则无需使用{{find()
限定调用std::
。 1}}。例如:
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
std::vector<int> v { 1, 2, 3 };
auto i = find(v.begin(), v.end(), 2); // ADL applies if the result of
// v.begin() and v.end() is an
// iterator whose type is defined
// in the std namespace!
std::cout << *i;
}
显然,这不适用于接受 no 参数的函数。在这种情况下,命名空间限定总是必要的,除非当然调用点在该命名空间内(尽管你不能向<{1}}命名空间添加任何东西,但是一些模板来自std
命名空间可以是专门的。)
答案 1 :(得分:1)
这取决于你如何调用std::find
...例如,如果从std容器传递一些迭代器,ADL将找到此函数,否则你必须添加std::
叫它。
答案 2 :(得分:0)
一开始你将librairie包含在你的程序中(std命名空间) 那么你不需要一直使用std这个词 但实际上所有对象都像std :: cout std :: cin
std是c ++的基础库之一
因为我的英语需要更正;)
答案 3 :(得分:0)
由于某种原因,STL选择在全局命名空间中公开许多算法(in)。这就是你可以写find(...)或转换(...)的原因。矢量未公开,因此您必须std::vector<>()
。或者您可以将std::vector;
放在文件顶部