C++ 重载运算符>&燃气轮机;用于不区分大小写的字符串
给定ci_字符串的定义,我们将如何实现操作符>?我尝试使用std::read,但它似乎不起作用(也就是说,gcount()正确计算输入的字符数,但没有输出)C++ 重载运算符>&燃气轮机;用于不区分大小写的字符串,c++,case-insensitive,istream,C++,Case Insensitive,Istream,给定ci_字符串的定义,我们将如何实现操作符>?我尝试使用std::read,但它似乎不起作用(也就是说,gcount()正确计算输入的字符数,但没有输出) #包括 #包括 #包括 //ci_字符串定义在这里 std::istream和运算符>>(std::istream和in、ci_字符串和str) { 返回in.read(&*str.begin(),4); } int main() { ci_字符串测试_str; 标准::cin>>测试; std::cout std::istream&am
#包括
#包括
#包括
//ci_字符串定义在这里
std::istream和运算符>>(std::istream和in、ci_字符串和str)
{
返回in.read(&*str.begin(),4);
}
int main()
{
ci_字符串测试_str;
标准::cin>>测试;
std::cout
std::istream& operator>>(std::istream& in, ci_string& str)
{
std::string tmp;
in >> tmp;
str.assign( tmp.begin(), tmp.end() );
return in;
}
怎么样
std::istream& operator>>(std::istream& in, ci_string& str)
{
std::string tmp;
in >> tmp;
str.assign( tmp.begin(), tmp.end() );
return in;
}
太好了!谢谢你,@Daniel Frey。如果你要走这条路,我会使用str.assign(tmp.begin(),tmp.end())
,而不是使用c_str
的解决方案。为什么要让目标重新计算长度,而你已经知道了呢?@JamesKanze它的可读性较差,但这是一个好主意。我只是想知道今天的编译器是否足够聪明,能够在上面的代码中直接从tmp
中提取长度作为优化。@DanielFrey less readable?只适用于不习惯使用标准库的人——与c_str
方法不同,它不涉及任何特殊的字符串函数,也不涉及过时的c字符串(当我看到c_str
时,我读到了“遗留接口”。对我来说,在其他地方使用它是一种混淆。)至于优化,这是不可能的。(就此而言,如果我正在读取一个以二进制模式打开的文件,而该文件恰好包含'\0'
,并且isspace('\0')
在嵌入区域设置中返回false,则您的解决方案是不正确的。)@JamesKanze好的,更新了答案。太糟糕了,std::string
和ci_string
之间的一些转换/赋值不能自动工作,如果能够直接分配std::string
会更好,甚至可能使用std::move(tmp)
:(太好了!谢谢你,@Daniel Frey。如果你要走这条路,我会使用str.assign(tmp.begin(),tmp.end())
,而不是使用c_str
的解决方案。为什么要让目标重新计算长度,而你已经知道了呢?@JamesKanze它的可读性较差,但这是一个好主意。我只是想知道今天的编译器是否足够聪明,能够在上面的代码中直接从tmp
中提取长度作为优化。@DanielFrey less readable?只适用于不习惯使用标准库的人——与c_str
方法不同,它不涉及任何特殊的字符串函数,也不涉及过时的c字符串(当我看到c_str
时,我读到了“遗留接口”。对我来说,在其他地方使用它是一种混淆。)至于优化,这是不可能的。(就此而言,如果我正在读取一个以二进制模式打开的文件,而该文件恰好包含'\0'
,并且isspace('\0')
在嵌入区域设置中返回false,则您的解决方案是不正确的。)@JamesKanze好的,更新了答案。太糟糕了,std::string
和ci_string
之间的一些转换/赋值不能自动工作,如果能够直接分配std::string
会更好,甚至可能使用std::move(tmp)
:(