3

ispunct()以这种方式分隔单词时效果很好"one, two; three"。然后它将删除“,;” 并用给定的字符替换。

但是如果以这种方式给出字符串,"ts='TOK_STORE_ID';"那么它将"ts='TOK_STORE_ID';"作为一个单独的标记,或者

"one,one, two;four$three two"作为三个令牌1. "one,one" 2. "two;four$three" 3. "two"

是否有任何一个"one,one, two;four$three two"可以被视为"one one two four three two"每个单独的令牌?

编写手动代码,例如:

for(i=0;i<str.length();i++)
{
  //validating each character
}

当字符串非常长时,此操作将变得非常昂贵。

那么还有其他功能ispunct()吗?还是别的什么?

在 c 中,我们这样做是为了比较每个字符:

  for(i=0;i<str.length();i++)
    {
      if(str[i]==',' || str[i]==",") // Is there any way here to compare with all puctuations in one shot?
        str[i]=" "; //replace with space

    }

在 c++ 中,正确的方法是什么?

4

4 回答 4

5

This operation will become very costly when string is very very long.

不,不会的。这将是一个O(n)有利于这个问题的操作。对于此操作,您无法获得比这更好的结果,因为无论哪种方式,您都必须查看字符串中的每个字符。如果不查看字符串中的每个字符,就无法做到这一点。

于 2013-08-31T05:17:22.593 回答
4

假设您正在处理一个典型的 8 位字符集,我将从构建一个转换表开始:

std::vector<char> trans(UCHAR_MAX);

for (int i=0; i<UCHAR_MAX; i++)
    trans[i] = ispunct(i) ? ' ' : i;

然后处理一串文本可以是这样的:

for (auto &ch : str)
    ch = trans[(unsigned char)ch];

对于 8 位字符集,转换表通常都适合您的 L1 缓存,并且循环只有一个高度可预测的分支(除非到达字符串末尾,否则总是采用),因此它应该相当快。

为了清楚起见,当我说“相当快”时,我的意思是我不可能成为您描述的过程中的瓶颈。您需要结合使用速度较慢的处理器和快速的网络连接,以防止这成为处理您通过网络获取的数据的瓶颈。

如果您有一个具有 10 GbE 网络连接的 Raspberry Pi,您可能需要做更多的优化工作才能跟上(但我什至不确定)。对于任何不太严重的不匹配,网络显然将成为瓶颈。

于 2013-08-31T06:27:36.223 回答
1
So is there any other function like ispunct()? or anything else?

事实上,有。man ispunct给了我这个美丽的清单:

int isalnum(int c);
int isalpha(int c);
int isascii(int c);
int isblank(int c);
int iscntrl(int c);
int isdigit(int c);
int isgraph(int c);
int islower(int c);
int isprint(int c);
int ispunct(int c);
int isspace(int c);
int isupper(int c);
int isxdigit(int c);

随心所欲。

于 2013-08-31T09:17:33.220 回答
0

您还可以使用std::remove_copy_if完全删除标点符号:

#include <algorithm>
#include <string>      

  string words = "I,love.punct-uation!";
  string result;  // this will be our final string after it has been purified

  // iterates through each character in the string
  // to remove all punctuation
  std::remove_copy_if(words.begin(), words.end(),            
                    std::back_inserter(result), //Store output           
                    std::ptr_fun<int, int>(&std::ispunct)  
                   );

  // ta-da!
  cout << result << endl;
于 2017-03-16T05:55:52.653 回答