寻找向量中最长字符串的分段错误
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
最初是空的,因此使用 any 值 i
对其进行索引将超出范围。 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;
}
由于我发现您开发的源代码可读性较低,因此我针对这个问题制定了新的解决方案。
#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_element
和 std::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
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
最初是空的,因此使用 any 值 i
对其进行索引将超出范围。 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;
}
由于我发现您开发的源代码可读性较低,因此我针对这个问题制定了新的解决方案。
#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_element
和 std::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