1

我曾经在 C++ 中有一些代码,它将字符串存储为字符矩阵中的一系列字符(字符串是一行)。Rcpp.h 提供了 Character matrix 和 LogicalVector 类:

LogicalVector unq_mat( CharacterMatrix x ){
  int nc = x.ncol() ; // Get the number of columns in the matrix. 
  LogicalVector out(nc); // Make a logical (bool) vector of the same length.
  // For every col in the matrix, assess whether the column contains more than one unique character.
  for( int i=0; i < nc; i++ ) {
    out[i] = unique( x(_,i) ).size() != 1 ;
    }
  return out;
}

逻辑向量标识哪些列包含多个唯一字符。然后将其传递回 R 语言并用于操作矩阵。这是一种非常 R 的思维方式。但是我有兴趣在 C++ 中发展我的思维,我想写一些实现上述目标的东西:所以找出 n 个字符串中的哪些字符并不完全相同,但最好使用像 std::string 这样的 stl 类。作为给出三个字符串的概念示例:A =“Hello”,B =“Heleo”,C =“Hidey”。代码会指出位置/字符 2、3、4、5 不是一个值,但位置/字符 1(“H”)在所有字符串中都是相同的(即只有一个唯一值)。我在下面有一些我认为有效的东西:

std::vector<int> StringsCompare(std::vector<string>& stringVector) {
    std::vector<int> informative;
    for (int i = 0; i < stringVector[0].size()-1; i++) {
        for (int n = 1; n < stringVector.size()-1; n++) {
            if (stringVector[n][i] != stringVector[n-1][i]) {
                informative.push_back(i);
                break;
            }
        }
    }
    return informative;
}

它应该通过外部循环遍历每个字符位置(0 到 string-1 的大小),并通过内部循环查看字符串 n 中的字符是否与字符串 n-1 中的字符不同。在字符完全相同的情况下,例如上面我的 hello 示例中的 H,这永远不会是真的。对于字符串中的字符不同的情况,将满足内部循环 if 语句,记录字符位置,并中断内部循环。然后我得到一个向量,其中包含 n 个字符串中字符的索引,其中字符并不完全相同。然而,这两个函数给了我不同的答案。我还能如何逐个字符地遍历 n 个字符串并检查它们是否完全相同?

谢谢,本。

4

1 回答 1

0

我希望@doctorlove 能提供答案。我会在这里输入一个,以防他没有。

要按索引遍历字符串或向量的所有元素,您需要ifrom0size()-1for (int i=0; i<str.size(); i++)停在尺寸不足的地方,即停在size()-1. 所以删除-1。

其次,C++ 数组是从 0 开始的,因此您必须进行调整(通过将 1 加到推入向量中的值)。

std::vector<int> StringsCompare(std::vector<std::string>& stringVector) {
    std::vector<int> informative;
    for (int i = 0; i < stringVector[0].size(); i++) {
        for (int n = 1; n < stringVector.size(); n++) {
            if (stringVector[n][i] != stringVector[n-1][i]) {
                informative.push_back(i+1);
                break;
            }
        }
    }
    return informative;
}

关于这段代码有几点需要注意:

  1. 该函数应该对向量进行 const 引用,因为输入向量没有被修改。这里并不是真正的问题,但由于各种原因,将未修改的输入引用声明为 const 是个好主意。
  2. 这假设所有字符串至少与第一个字符串一样长。如果不成立,则代码的行为是未定义的。i对于“生产”代码,您应该在提取每个字符串的第 th 个元素之前检查长度。
于 2013-11-10T20:52:08.077 回答