Я пытаюсь сравнить символы двух строк по заданному индексу. Однако я получаю следующую ошибку:
Line 9: Char 26: error: invalid operands to binary expression ('const __gnu_cxx::__alloc_traits<std::allocator<char>, char>::value_type' (aka 'const char') and 'const std::__cxx11::basic_string<char>')
if (s[i] != letter) { return s.substr(0, i); }
~~~~ ^ ~~~~~~
Вот мой код:
string longestCommonPrefix(vector<string>& strs) {
auto comp = [](const string& a, const string& b) { return a.size() < b.size(); };
const auto smallest = min_element(strs.begin(), strs.end(), comp);
for (int i = 0; i < smallest->size(); ++i) {
const auto letter = smallest[i];
for (const auto& s : strs) {
if (s[i] != letter) { return s.substr(0, i); } // <- error occurs here
}
}
return smallest;
}
Может кто-нибудь объяснить, почему это не работает?
for
.
@PaulMcKenzie Спасибо, я посмотрю на эту функцию!
В вашем коде smallest
является
std::vector<std::string>::iterator const
который является итератором произвольного доступа, поэтому предоставляет operator[]
.
Однако,
smallest[i]
эквивалентно
*(smallest + i)
поэтому он вернет ссылку на i
-ю строку после строки, на которую указывает
smallest
вместо i
-го символа строки, на которую указывает
smallest
(это то, что вы хотите).
Чтобы получить i
-й символ строки, на которую указывает smallest
, вы должны
сначала почтить его:
(*smallest)[i]
И вы также должны уважать это в заявлении return
.
Кроме того, я рекомендую вам передать strs
как ссылку на const
и проверить, что smallest
не является конечным итератором (что может произойти, если входной вектор пуст):
string longestCommonPrefix(vector<string> const& strs) {
auto comp = [](const string& a, const string& b) {
return a.size() < b.size();
};
const auto smallest = std::min_element(strs.begin(), strs.end(), comp);
if (smallest == strs.end()) return "";
for (int i = 0; i < smallest->size(); ++i) {
const auto letter = (*smallest)[i];
for (const auto& s : strs) {
if (s[i] != letter) return s.substr(0, i);
}
}
return *smallest;
}
Тип
smallest
— этоstd::vector<std::string>::iterator
, а неoperator[]
.