寻找向量中最长字符串的分段错误

Segmentation fault looking for longest strings in a vector

vector<string> solution(vector<string> ia) {
  int maxi = -1;
  int size = ia.size();
  vector<string> iasol;
  for (int i = 0; i < size; i++) {
    int m = ia[i].length();
    cout << m << " " << maxi << endl;
    if (m > maxi) {
      maxi = m;
    }
  }
  for (int i = 0; i < size; i++) {
    int m = ia[i].length();
    if (m == maxi) {
      iasol[i] = ia[i];
      cout << iasol[i];
    }
  }
  return iasol;
}

这就是问题所在

给定一个字符串数组,return另一个包含所有最长字符串的数组。

例子

对于 inputArray = ["aba", "aa", "ad", "vcd", "aba"],输出应该是

解决方案(inputArray) = ["aba", "vcd", "aba"].

问题是 iasol 最初是空的,因此使用 anyi 对其进行索引将超出范围。 std::vector 在您向其中添加元素时增长。而不是在第二个循环中使用 iasol[i] = ia[i];,而是使用 iasol.push_back(ia[i]); 将其添加到结果中。 live example

我还建议使用 ranged-for 而不是基于索引来使这一点更清楚。

std::vector<std::string> solution(const std::vector<std::string>& input) {
  std::size_t max_size{};
  for (const auto& s : input) {
    auto sz = s.size();
    if (sz > max_size) {
      max_size = sz;
    }
  }
  
  std::vector<std::string> longest_strings;
  for (const auto& s : input) {
    if (s.size() == max_size) {
      longest_strings.push_back(s);
    }
  }
  return longest_strings;
}

live link

由于我发现您开发的源代码可读性较低,因此我针对这个问题制定了新的解决方案。

#include <iostream>
#include <vector>

using namespace std;

/* Returns the size of the vector with the maximum length. */
size_t getMaximumSize(vector<string> input);

/* Returns a vector container based on the string length. */
vector<string> getElementBySize(vector<string> input, size_t size);

/* Prints the vector container. */
void print(vector<string> input);

int main()
{
    vector<string> input{"aba", "aa", "ad", "vcd", "aba"};
    print(getElementBySize(input, getMaximumSize(input)));
    return 0;
}

vector<string> getElementBySize(vector<string> input, size_t size)
{
    vector<string> result;
    
    for(int i = 0 ; i < input.size(); ++i)
        if(input[i].size() == size)
            result.push_back(input[i]);
            
    return result;
}

size_t getMaximumSize(vector<string> input)
{
    size_t maximumNumberOfCharacters = input[0].size();

    for(int i = 0 ; i < input.size() - 1 ; ++i)
        if(input[i].size() < input[i+1].size())
            maximumNumberOfCharacters = input[i+1].size();
    
    return maximumNumberOfCharacters;
}

void print(vector<string> input)
{
    for(string i : input)
        cout << i << ' ';
}

该程序产生以下输出:

aba vcd aba

向量声明为like

vector<string> iasol;

没有元素。所以这个声明

iasol[i] = ia[i];

调用未定义的行为。

您需要应用两个标准算法 std::max_elementstd::copy_if

这是一个演示程序。

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>

std::vector<std::string> solution( const std::vector<std::string> &v )
{
    auto it = std::max_element( std::begin( v ), std::end( v ),
        []( const auto &s1, const auto &s2 )
        {
            return s1.size() < s2.size();
        } );

    auto n = it->size();

    std::vector<std::string> result;

    std::copy_if( std::begin( v ), std::end( v ), std::back_inserter( result ),
        [&n]( const auto &s ) 
        { 
            return s.size() == n; 
        } );

    return result;
}


int main()
{
    std::vector<std::string> v = { "aba", "aa", "ad", "vcd", "aba" };

    auto result = solution( v );

    for (const auto &s : result)
    {
        std::cout << s << ' ';
    }

    std::cout << '\n';
}

程序输出为

aba vcd aba