你怎么称呼这个作业?指针的迭代器?

时间:2016-04-10 06:04:19

标签: c++11

作为一个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. 这是正确的方法吗?
  2. 你怎么称呼这个程序?指针的迭代器?

更新#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;
}

1 个答案:

答案 0 :(得分:0)

  

这是正确的方法吗?

我认为

  

你怎么称呼这个程序?指针的迭代器?

我宁愿称之为dereference an iterator

如果将所有低位字母放入没有ab的字符串中,我可以通过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