应该避免还是鼓励“使用std::cin”和“使用std::cout”?
Should `using std::cin` and `using std::cout` be avoided or encouraged?
我搜索了这个网站,有人说你应该避免使用 using namespace std
。我完全同意。但是,using std::cin
和 using std::string
呢?应该避免还是鼓励这种情况?
我知道总是输入 std::cin
是最安全的选择,但是一次又一次地输入它们非常乏味。
但是,当你在文件的开头键入using std::cin
等时,看起来很拥挤。比如这个简单的读取和计算学生成绩的程序,前面太多using std::
,看着很不舒服
#include <iostream>
#include <ios>
#include <iomanip>
#include <stdexcept>
#include <vector>
using std::cin; using std::cout;
using std::istream; using std::vector;
using std::setprecision; using std::domain_error;
using std::string; using std::getline;
using std::streamsize;
istream& read_hw(istream& in, vector<double>& homework);
double grade(double mid_exam, double final_exam, \
const vector<double>& homework);
int main() {
std::string name;
std::getline(std::cin, name);
std::cout << "Hello, " + name + "!" << std::endl;
double mid_exam, final_exam;
std::cin >> mid_exam >> final_exam;
std::vector<double> homework;
read_hw(std::cin, homework);
try {
double final_grade = grade(mid_exam, final_exam, homework);
std::streamsize prec = std::cout.precision();
std::cout << "your final grade is:" << std::setprecision(3)
<< final_grade << std::setprecision(prec) << std::endl;
}
catch(std::domain_error) {
std::cout << std::endl << "No homework entered!" << std::endl;
return 1;
}
return 0;
}
std::istream& read_hw(std::istream& in, std::vector<double>& homework) {
if(in) {
homework.clear();
double x;
while(in >> x) {
homework.push_back(x);
}
}
in.clear();
return in;
}
double grade(double mid_exam, double final_exam, \
const std::vector<double>& homework) {
std::vector<double>::size_type i, size;
size = homework.size();
if(size ==0) {
throw std::domain_error("no homework grade entered!");
}
double sum = 0;
double average = 0;
for(i = 0; i < size; ++i) {
sum += homework[i];
}
average = sum/size;
return mid_exam*0.3 + final_exam*0.3 + average*0.4;
}
Remember, there is nothing wrong with using from Package import
specific_submodule
! In fact, this is the recommended notation unless
the importing module needs to use submodules with the same name from
different packages.
我想知道在 C++ 程序中我应该做什么。
永远不要在header文件中使用using namespace std;
或类似的东西,因为它会导致各种歧义由于命名空间 污染 而出现的问题。如果您遵守该规则,那么必须包含您的 header 的人会为此感谢您。出于类似的原因,我也会避免在 header 中使用任何形式的 using std::...
。学会喜欢更冗长的 std::
符号。
您在源文件中所做的在很大程度上取决于您自己。这里的任何建议主要是 opinion-based,但就我个人而言,我 从不 使用 using
只是为了节省打字时间,而是在不可避免的情况下使用,例如将阴影函数带回命名空间,并在模板元编程中。
恕我直言,这个问题是基于意见的。但是,这是我的看法:
不要使用:
using std::cin;
using std::cout;
using std::string;
之类的。我的论点相当简单,用
可以更好地证明
using std::sort;
using std::vector;
假设您有一个包含错误的代码,现在您应该找到它。使用的任何对象或函数,如果前面有 std::
,则极不可能包含错误。因此我总是更喜欢看到
std::vector<double> x;
std::sort(x);
而不是
vector<double> x;
sort(x);
因为后者需要我查找 vector
和 sort
实际上是什么(记住我们在谈论 C++,即它可以是任何字面意思),只是为了找出它是 std::vector
和 std::sort
。结论:我每次花在写作上的时间 std::
节省了我两倍或更多的调试时间。
让它不那么基于意见:你必须做出的明确权衡是可读性和更少的输入。基于意见的是您更看重的....
我搜索了这个网站,有人说你应该避免使用 using namespace std
。我完全同意。但是,using std::cin
和 using std::string
呢?应该避免还是鼓励这种情况?
我知道总是输入 std::cin
是最安全的选择,但是一次又一次地输入它们非常乏味。
但是,当你在文件的开头键入using std::cin
等时,看起来很拥挤。比如这个简单的读取和计算学生成绩的程序,前面太多using std::
,看着很不舒服
#include <iostream>
#include <ios>
#include <iomanip>
#include <stdexcept>
#include <vector>
using std::cin; using std::cout;
using std::istream; using std::vector;
using std::setprecision; using std::domain_error;
using std::string; using std::getline;
using std::streamsize;
istream& read_hw(istream& in, vector<double>& homework);
double grade(double mid_exam, double final_exam, \
const vector<double>& homework);
int main() {
std::string name;
std::getline(std::cin, name);
std::cout << "Hello, " + name + "!" << std::endl;
double mid_exam, final_exam;
std::cin >> mid_exam >> final_exam;
std::vector<double> homework;
read_hw(std::cin, homework);
try {
double final_grade = grade(mid_exam, final_exam, homework);
std::streamsize prec = std::cout.precision();
std::cout << "your final grade is:" << std::setprecision(3)
<< final_grade << std::setprecision(prec) << std::endl;
}
catch(std::domain_error) {
std::cout << std::endl << "No homework entered!" << std::endl;
return 1;
}
return 0;
}
std::istream& read_hw(std::istream& in, std::vector<double>& homework) {
if(in) {
homework.clear();
double x;
while(in >> x) {
homework.push_back(x);
}
}
in.clear();
return in;
}
double grade(double mid_exam, double final_exam, \
const std::vector<double>& homework) {
std::vector<double>::size_type i, size;
size = homework.size();
if(size ==0) {
throw std::domain_error("no homework grade entered!");
}
double sum = 0;
double average = 0;
for(i = 0; i < size; ++i) {
sum += homework[i];
}
average = sum/size;
return mid_exam*0.3 + final_exam*0.3 + average*0.4;
}
Remember, there is nothing wrong with using
from Package import specific_submodule
! In fact, this is the recommended notation unless the importing module needs to use submodules with the same name from different packages.
我想知道在 C++ 程序中我应该做什么。
永远不要在header文件中使用using namespace std;
或类似的东西,因为它会导致各种歧义由于命名空间 污染 而出现的问题。如果您遵守该规则,那么必须包含您的 header 的人会为此感谢您。出于类似的原因,我也会避免在 header 中使用任何形式的 using std::...
。学会喜欢更冗长的 std::
符号。
您在源文件中所做的在很大程度上取决于您自己。这里的任何建议主要是 opinion-based,但就我个人而言,我 从不 使用 using
只是为了节省打字时间,而是在不可避免的情况下使用,例如将阴影函数带回命名空间,并在模板元编程中。
恕我直言,这个问题是基于意见的。但是,这是我的看法:
不要使用:
using std::cin;
using std::cout;
using std::string;
之类的。我的论点相当简单,用
可以更好地证明using std::sort;
using std::vector;
假设您有一个包含错误的代码,现在您应该找到它。使用的任何对象或函数,如果前面有 std::
,则极不可能包含错误。因此我总是更喜欢看到
std::vector<double> x;
std::sort(x);
而不是
vector<double> x;
sort(x);
因为后者需要我查找 vector
和 sort
实际上是什么(记住我们在谈论 C++,即它可以是任何字面意思),只是为了找出它是 std::vector
和 std::sort
。结论:我每次花在写作上的时间 std::
节省了我两倍或更多的调试时间。
让它不那么基于意见:你必须做出的明确权衡是可读性和更少的输入。基于意见的是您更看重的....