Как насчет того, чтобы просто:
bool prefix(const std::string& a, const std::string& b) {
if (a.size() > b.size()) {
return a.substr(0,b.size()) == b;
}
else {
return b.substr(0,a.size()) == a;
}
}
C ++ не C, безопасно, просто, эффективно.
Протестировано с:
#include <string>
#include <iostream>
bool prefix(const std::string& a, const std::string& b);
int main() {
const std::string t1 = "test";
const std::string t2 = "testing";
const std::string t3 = "hello";
const std::string t4 = "hello world";
std::cout << prefix(t1,t2) << "," << prefix(t2,t1) << std::endl;
std::cout << prefix(t3,t4) << "," << prefix(t4,t3) << std::endl;
std::cout << prefix(t1,t4) << "," << prefix(t4,t1) << std::endl;
std::cout << prefix(t1,t3) << "," << prefix(t3,t1) << std::endl;
}
Если у вас C ++ 17, вы можете написать лучшую версию этого, используя вместо этого std::string_view
:
#include <string>
#include <string_view>
bool prefix(const std::string& a, const std::string& b) {
if (a.size() > b.size()) {
return std::string_view(a.c_str(),b.size()) == b;
}
else {
return std::string_view(b.c_str(),a.size()) == a;
}
}
В g ++ 7 с параметром -O3 это сводится к одному вызову memcmp
, что является довольно существенным улучшением по сравнению со старой версией.
person
Flexo
schedule
27.10.2011
string.compare()
? - person Alok Save   schedule 27.10.2011n
. - person fredley   schedule 27.10.2011==
. ;-) - person Frerich Raabe   schedule 27.10.2011N
был неизвестен (хотя, если вы ищете префикс, это довольно хорошо известно!) - person David Rodríguez - dribeas   schedule 27.10.2011==
не возвращает истину для 'String' и 'String:', строго говоря или иначе. - person Jim Balter   schedule 15.05.2019