标准::替换的逻辑错误
Logic error with std::replace
今天我在做学校项目时遇到了一个逻辑错误。对于此项目,需要切换chars
。
例如,用户输入字母A
.它被切换到U
,一切都很好。但是,当用户输入字母 U
时,会出现此问题。角色保持不变。我实现了两个规则来从A
切换到U
和U
切换到A
。字符串通过这两个规则传递,因此保持不变。我该如何防止这种情况?
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
string seq;
getline(cin, seq);
transform ( seq.begin(), seq.end(), seq.begin(), ::toupper );
replace ( seq.begin(), seq.end(), 'A', 'U' );
replace ( seq.begin(), seq.end(), 'U', 'A' );
cout << seq;
return 0;
}
通过您的实现,您可以将A
替换为U
然后U
回A
:
replace ( seq.begin(), seq.end(), 'A', 'U' );
replace ( seq.begin(), seq.end(), 'U', 'A' );
您需要一次性进行更换,例如使用std::transform
:
std::transform(begin(seq), end(seq), begin(seq), some_function_object);
你只需要写这个神秘的some_function_object
.它可以是一个自由函数:
char some_function_object(char input) { /* ... */ }
std::transform(begin(seq), end(seq), begin(seq), some_function_object);
或 lambda 函数:
std::transform(begin(seq), end(seq), begin(seq), [](char input) { /* ... */ } );
此函数对象必须采用char
并返回:
-
A
input
是否U
; -
U
input
是否A
; -
input
否则。
如果它是一个免费函数,你应该如何称呼它?好吧,为什么不像swapAandU
这样的自我描述性名称呢?
当基于范围的 for 循环比使用标准算法(例如 std::transform(更合适、更有效时,情况似乎就是这样。
例如
#include <iostream>
#include <string>
int main()
{
std::string s( "AUAUA" );
std::cout << s << std::endl;
for ( char &c : s )
{
if ( c == 'A' ) c = 'U';
else if ( c == 'U' ) c = 'A';
}
std::cout << s << std::endl;
return 0;
}
程序输出为
AUAUA
UAUAU
您可以编写一个单独的函数,例如
#include <iostream>
#include <string>
std::string & convert( std::string &s1, const std::string &s2, const std::string &s3 )
{
for ( char &c : s1 )
{
auto i = s2.find( c );
if ( i != std::string::npos ) c = s3[i];
}
return s1;
}
int main()
{
std::string s( "AUAUA" );
std::cout << s << std::endl;
std::cout << convert( s, "AU", "UA" ) << std::endl;
return 0;
}
如果对字符串 s2 进行排序,则可以使用二叉搜索算法而不是线性搜索。
如果你想使用标准算法,那么在我看来,最合适的算法是std::for_each
与基于范围的 for 循环相对应。例如,第一个演示程序可以使用算法重写如下方式
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string s( "AUAUA" );
std::cout << s << std::endl;
std::for_each( s.begin(), s.end(),
[]( char &c )
{
if ( c == 'A' ) c = 'U';
else if ( c == 'U' ) c = 'A';
} );
std::cout << s << std::endl;
return 0;
}
相关文章:
- 为什么这个分配器不适用于"std::allocate_shared"?奇怪的模板替换错误
- 如何使替换 c 函数的变量名成为错误?
- 使用 g++ 预处理器进行替换会导致链接错误
- C++ 带有 decltype 的 SFINAE:替换失败成为错误?
- 在将 unicode 替换为C++字符串中的空格时出现分段错误
- C++代码在 for 循环的条件下给出运行时错误,而如果它被具有相同意义的代码替换,则编译正确
- 简单的字符串替换给出错误,尽管参数正确
- 标准::替换的逻辑错误
- C++字符串.替换生成"No matching function for call"错误
- 如何对 SFINAE 进行"deep",即当替换导致代码中进一步出现一些编译错误时?
- 使用 std::enable_if 重载函数以避免模板替换错误
- 替换WCHAR_T错误返回存储地址
- 模板扣除/替换错误,并返回
- C sqlite3插入或替换查询我认为是错误的
- C++:使用类型作为映射键会导致模板替换错误
- C++ - 通过提升进行反向替换 - 错误的索引错误
- 运算符重载代码编译错误,模板参数推断/替换失败
- 将 std::vector 的缓冲区替换为错误定位的字符数组
- 错误:与"运算符=="不匹配,模板参数推断/替换失败:
- 程序错误:用"%20"替换空格