作为一个hobbie我正在尝试这个代码,它在一个循环中复制到另一个字符串对象除了'a'和'e'之外的所有字符:
// Example program
#include <iostream>
#include <string>
int main()
{
std::string orig_str;
std::string new_str;
std::cout << "Please input a string: ";
getline (std::cin, orig_str);
for (auto i = orig_str.begin (); i != orig_str.end(); ++i)
if (*i != 'a' && *i != 'e')
new_str += *i; // ???
std::cout << "Original: [" << orig_str << "]\n";
std::cout << "Changed: [" << new_str << "]\n";
}
我有几个问题:
更新#1
使用std :: copy_if不会将原始字符串的允许字母复制到新容器中:
#include <iostream>
#include <string>
#include <algorithm>
using std::string;
using std::cout;
using std::cin;
using std::copy_if;
int main () {
string org_str; // original string
string upd_str; // updated string
upd_str.resize(org_str.size()); // make room
cout << "Input some string: ";
getline (cin, org_str);
cout << "Original string: [" << org_str << "]\n";
auto it = copy_if (org_str.begin(), org_str.end(), upd_str.begin(), [](int i) { return ((i != 'a') || (i != 'e')); });
upd_str.resize (std::distance (upd_str.begin(), it)); // shrink to actual size
cout << "Updated string: [" << upd_str << "]\n"; // show updated string, but is empty
return 0;
}
更新#2
现在有了工作代码,我用一个向量更新了它,它允许你在原始字符串中选择你不想要的元音:
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using std::string;
using std::cout;
using std::cin;
using std::copy_if;
using std::back_inserter;
using std::vector;
using std::find;
int main () {
string org_str; // original string
string upd_str; // updated string
vector<char> pass = {'a', 'e', 'o'}; // this vowels not allow
cout << "Input some string: ";
getline (cin, org_str);
cout << "Original string: [" << org_str << "]\n";
copy_if (org_str.begin(), org_str.end(), back_inserter(upd_str), [pass](char i) { auto it = find (pass.begin(), pass.end(), i); return (it == pass.end());});
cout << "Updated string: [" << upd_str << "]\n"; // show updated string
return 0;
}
答案 0 :(得分:0)
这是正确的方法吗?
我认为是
你怎么称呼这个程序?指针的迭代器?
否我宁愿称之为dereference an iterator
。
如果将所有低位字母放入没有a
和b
的字符串中,我可以通过std::regex
库来解决它,而不是你的for循环,如下所示:
std::regex regex( "[bcdf-z]" );
std::regex_token_iterator< std::string::const_iterator >
first(orig_str.begin(), orig_str.end(), regex ), last;
while( first != last ){
new_str += *first; // dereference an iterator
++first;
}
或std::remove
new_str = orig_str;
new_str.erase( std::remove( new_str.begin(), new_str.end(), 'e' ), new_str.end() );
new_str.erase( std::remove( new_str.begin(), new_str.end(), 'a' ), new_str.end() );
或甚至与std::regex_replace
new_str = std::regex_replace( orig_str, std::regex( "[ae]" ), "" ); // return a copy