【问题标题】:Return the shortest string返回最短的字符串
【发布时间】:2014-12-17 02:20:49
【问题描述】:

我正在尝试编写一个从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;
}

没有打印任何内容。我做错了什么?

【问题讨论】:

  • 如果将shortss 初始化为std::numeric_limits&lt;int&gt;::max(),则无需检查“第一次”迭代。换句话说,你拥有的任何字符串都会比 max int 短。
  • 天哪,我没有看到 i == 0 错误。
  • 通过 const 引用传递你的向量,否则你正在制作一个不必要的副本。如果你想变得超级聪明,你可以从向量中返回对最短字符串的引用。

标签: c++ string string-length


【解决方案1】:

您也可以使用 STL 算法来执行此操作。

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

【讨论】:

    【解决方案2】:

    此声明:

            if (i = 0) {
    

    应该是

            if (i == 0) {
    

    单等于=,它是一个赋值语句,结果是被赋值的值。所以它不会测试i 来查看它是否为零,而是将0 分配给i,然后不运行if 块。

    【讨论】:

    • 即使 i 只递增到 1,它仍然会循环遍历向量中的所有字符串,因为使用的是基于范围的循环,而不是基于索引的访问
    • @illeyezur:很好,谢谢,我已经删除了那个不正确的部分。
    • 我要补充一点,if (i = 0) 是一个有效的测试(也是一个作业),但它的结果是 FALSE 而不是 TRUE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多