我以前在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并检查它们是否完全相同?
谢谢, 本。
答案 0 :(得分:0)
我希望@doctorlove提供答案。如果他没有,我会在这里输入一个。
要按索引遍历字符串或向量的所有元素,您需要i
从0
到size()-1
。 for (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;
}
有关此代码的一些注意事项:
i
元素之前检查长度。