2014-10-21 1 views
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; 
} 

ИКА, если я сделал некоторые глупые ошибки, но она ничего не возвращает. Вот мой main():

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

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

+0

При инициализации '' shortss' к StD :: numeric_limits :: макс() ', вам не нужно, чтобы проверить на "первой" итерации. Другими словами, любая строка, которая у вас есть, будет короче, чем max int. – crashmstr

+0

OMG я не видел ошибку i == 0. – user3650284

+0

Передайте свой вектор по ссылке const, иначе вы делаете ненужную копию. Если вы хотите быть супер умным, вы можете вернуть ссылку на кратчайшую строку из вектора. –

ответ

2

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

 if (i = 0) { 

должен быть

 if (i == 0) { 

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

+1

Несмотря на то, что i только увеличивается до 1, он все равно будет перебирать все строки в векторе, поскольку используется цикл, основанный на диапазоне, а не на основе индексов – illeyezur

+0

@illeyezur: Спасибо, я удалил этот неправильный бит. –

+0

Я добавлю, что 'if (i = 0)' является допустимым тестом (а также назначением), но его результатом является 'FALSE' вместо' TRUE'. –

2

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

smin = *std::min_element(v.begin(), v.end(), 
        [] (const std::string& s1, const std::string& s2) { 
         return s1.length() < s2.length(); } 
        ); 
+1

Пример онлайн здесь: http://ideone.com/ybjXty – PaulMcKenzie