Вернуть самую короткую строку

0

Я пытаюсь написать функцию, которая вернет кратчайшую строку из vector<string>:

// Find the shortest string.
string shortestString(vector<string> v) {
    string shortest;
    int shortss = 0;
    int i = 0;
    for (string s : v) {
            if (i = 0) {
            shortss = s.length();
            shortest = s;
            i++;
        }
        else if (s.length() < shortss) {
            shortss = s.length();
            shortest = s;
        }
    }
    return shortest;
}

IDK, если я совершил какую-то глупую ошибку, но ничего не возвращает. Вот моя main():

int main() {
    vector<string> words = { "a", "ab", "abc" };
    string shor = shortestString(words);
    cout << shor;
}

Ничего не печатается. Что я делаю не так?

  • 0
    Если вы инициализируете shortss в std::numeric_limits<int>::max() , вам не нужно проверять «первую» итерацию. Другими словами, любая ваша строка будет короче max int.
  • 0
    Боже мой, я не увидел ошибку == 0.
Показать ещё 1 комментарий
Теги:
string
string-length

2 ответа

2
Лучший ответ

Это утверждение:

        if (i = 0) {

должно быть

        if (i == 0) {

При единственном равенстве =, это оператор присваивания, а результат - назначенное значение. Поэтому он не будет тестировать i чтобы увидеть, равен ли он нулю или нет, он будет присваивать 0 i а затем не запускать это, if блок.

  • 1
    Несмотря на то, что значение i увеличивается только до 1, оно все равно будет проходить по всем строкам в векторе, поскольку используется цикл на основе диапазона, а не доступ на основе индексов.
  • 0
    @illeyezur: Хорошо, спасибо, я удалил этот неверный бит.
Показать ещё 1 комментарий
2

Вы также можете использовать алгоритм STL для этого.

smin = *std::min_element(v.begin(), v.end(), 
                     [] (const std::string& s1, const std::string& s2) { 
                         return s1.length() < s2.length(); }
                     );
  • 1
    Онлайн пример здесь: ideone.com/ybjXty

Ещё вопросы

Сообщество Overcoder
Наверх
Меню