字符串与c ++的比较

时间:2013-11-10 16:22:45

标签: c++ string r compare rcpp

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

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 =“你好”,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到字符串-1的大小),并且使用内部循环,查看字符串n中的字符是否与字符串n-1中的字符不同。在角色完全相同的情况下,例如上面我的hello示例中的H,这将永远不会成立。对于字符串中的字符不同的情况,将满足inter循环if语句,记录字符位置,并打破内部循环。然后我得到一个向量,其中包含n个字符串中字符的标记,其中字符不完全相同。然而,这两个功能给了我不同的答案。我怎样才能通过char检查n个字符串char并检查它们是否完全相同?

谢谢, 本。

1 个答案:

答案 0 :(得分:0)

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

要按索引遍历字符串或向量的所有元素,您需要i0size()-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. 该函数应该对vector进行const引用,因为输入向量不会被修改。这里不是问题,但由于各种原因,将未修改的输入引用声明为const是个好主意。
  2. 这假定所有字符串至少与第一个字符串一样长。如果不成立,则代码的行为是不确定的。对于“生产”代码,您应该在提取每个字符串的i元素之前检查长度。