Преди имах някакъв код в C++, който съхранява низове като поредица от знаци в символна матрица (низът е ред). Класовете Character matrix и 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 низове не са еднакви, но за предпочитане използва stl класове като std::string. Като концептуален пример са дадени три низа: 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 до размера на низ-1) с външния цикъл и с вътрешния цикъл, вижте дали знакът в низ n не е същият като знака в низ n-1. В случаите, когато символът е един и същ, например H в моя пример за здравей по-горе, това никога няма да е вярно. За случаите, когато символите в низовете са различни, операторът if за вътрешни цикли ще бъде изпълнен, позицията на знака записана и вътрешният цикъл ще бъде прекъснат. След това получавам вектор, съдържащ индексите на символите в n низа, където знаците не са идентични. Тези две функции обаче ми дават различни отговори. Как иначе мога да прегледам n низа char по char и да проверя, че не всички са идентични?
Благодаря, Бен.
i < stringVecotr[0].size()-1
- с по-малко от, нямате нужда от-1
- person doctorlove   schedule 10.11.2013n < stringVector.size()-1
- пропускате последния запис. Също така обмислете използването наsize_t
вместоint
. Не само, че вашият компилатор ще докладва по-малко предупреждения, това също е правилното нещо, което трябва да направите. - person IInspectable   schedule 10.11.2013operator[]
на std::vector или std::string (int ще бъде преобразуван в size_t за тази операция). Още нещо, вашият подпис на C++ функция трябва да бъдеstd::vector<int> StringsCompare(const std::vector<std::string>& stringVector)
. Обърнете внимание наconst
. - person Matthew Lundberg   schedule 10.11.2013std::vector<std::string>
. - person Dirk Eddelbuettel   schedule 11.11.2013