将函数的 return 向量分配给另一个向量时出现分段错误
Segmentation fault when assigning the return vector of a function to another vector
我的一项家庭作业有问题,我们需要使用散列 table 检测字符串向量中的重复字符串。我的代码可以正常构建和编译,但是当我尝试将重复检测算法中的 return 向量分配给重复向量时出现分段错误。我试图弄清楚为什么会发生这种情况,但找不到解决方案。我在下面附上了我的代码。
使用散列查找重复项的函数table ##
std::vector<std::string>find_duplicates_with_hashtable(std::vector<std::string> & strings) {
std::vector<std::string> dups;
typedef std::unordered_map<std::string, std::string> hashtable;
hashtable table;
for (std::vector<std::string>::iterator i = strings.begin(); i < strings.end(); i++) {
std::unordered_map<std::string, std::string>::const_iterator it = table.find(*i);
if (it != table.end() && (std::find(dups.begin(), dups.end(), *i)) == dups.end()) {
dups = find_duplicates_with_sorting(dups); // line causing the problem
}
table.emplace(*i, *i);
}
return dups;
}
用于检查给定向量中的任何元素是否存在于重复向量中的函数
std::vector<std::string> find_duplicates_with_sorting(std::vector<std::string> & strings) {
std::vector<std::string> dups;
std::sort(strings.begin(), strings.end());
for( unsigned int i = 0; i < strings.size() - 1; ++i ) {
if( strings[i].compare(strings[i+1]) == 0 ) {
std::string found_dup = strings[i];
if( dups.size() == 0 ) {
dups.push_back(found_dup);
}
else
{
std::string last_found_dup = dups[ dups.size() - 1 ];
if( last_found_dup.compare(found_dup) != 0 ) { // Not a dup of a dup
dups.push_back(found_dup);
}
}
}
}
return dups;
}
这是调用哈希 table 函数的上下文
TEST(BaseHash, SuperShortVector)
{
std::vector<std::string> dups_found;
auto & search_vector = super_short_vector;
auto & known_dups_vector = super_short_vector_dups;
dups_found = find_duplicates_with_hashtable(search_vector);
std::sort(dups_found.begin(), dups_found.end());
std::sort(known_dups_vector.begin(), known_dups_vector.end());
}
导致问题的行在 'find_duplicates_with_hashtable' 函数中用注释标记
此外,由于这是一项家庭作业,如果有人能解释我做错了什么,并给我一个我可以努力解决问题的大致方向,我将不胜感激,因为只是复制粘贴代码不会帮助我学习
抱歉,如果代码很糟糕。我无法理解如何使用散列 tables。
谢谢:)
段错误发生在这里:
for( unsigned int i = 0; i < strings.size() - 1; ++i ) {
if( strings[i].compare(strings[i+1]) == 0 ) {
问题是您将无符号值 i
与从 strings.size() - 1
返回的无符号值进行比较。当 strings.size()
为 0
时,这部分 i < strings.size() - 1
将检查 i
是否小于最大整数值,这(基本上)总是为真。
这会导致 strings[i+1]
在 strings
的长度为 0 或 1 时出现段错误。
这可以通过多种方式修复,但 for( int i = 0; i < (int)strings.size() - 1; ++i ) {
是一种快速而肮脏的修复方法。
我的一项家庭作业有问题,我们需要使用散列 table 检测字符串向量中的重复字符串。我的代码可以正常构建和编译,但是当我尝试将重复检测算法中的 return 向量分配给重复向量时出现分段错误。我试图弄清楚为什么会发生这种情况,但找不到解决方案。我在下面附上了我的代码。
使用散列查找重复项的函数table ##
std::vector<std::string>find_duplicates_with_hashtable(std::vector<std::string> & strings) {
std::vector<std::string> dups;
typedef std::unordered_map<std::string, std::string> hashtable;
hashtable table;
for (std::vector<std::string>::iterator i = strings.begin(); i < strings.end(); i++) {
std::unordered_map<std::string, std::string>::const_iterator it = table.find(*i);
if (it != table.end() && (std::find(dups.begin(), dups.end(), *i)) == dups.end()) {
dups = find_duplicates_with_sorting(dups); // line causing the problem
}
table.emplace(*i, *i);
}
return dups;
}
用于检查给定向量中的任何元素是否存在于重复向量中的函数
std::vector<std::string> find_duplicates_with_sorting(std::vector<std::string> & strings) {
std::vector<std::string> dups;
std::sort(strings.begin(), strings.end());
for( unsigned int i = 0; i < strings.size() - 1; ++i ) {
if( strings[i].compare(strings[i+1]) == 0 ) {
std::string found_dup = strings[i];
if( dups.size() == 0 ) {
dups.push_back(found_dup);
}
else
{
std::string last_found_dup = dups[ dups.size() - 1 ];
if( last_found_dup.compare(found_dup) != 0 ) { // Not a dup of a dup
dups.push_back(found_dup);
}
}
}
}
return dups;
}
这是调用哈希 table 函数的上下文
TEST(BaseHash, SuperShortVector)
{
std::vector<std::string> dups_found;
auto & search_vector = super_short_vector;
auto & known_dups_vector = super_short_vector_dups;
dups_found = find_duplicates_with_hashtable(search_vector);
std::sort(dups_found.begin(), dups_found.end());
std::sort(known_dups_vector.begin(), known_dups_vector.end());
}
导致问题的行在 'find_duplicates_with_hashtable' 函数中用注释标记
此外,由于这是一项家庭作业,如果有人能解释我做错了什么,并给我一个我可以努力解决问题的大致方向,我将不胜感激,因为只是复制粘贴代码不会帮助我学习
抱歉,如果代码很糟糕。我无法理解如何使用散列 tables。
谢谢:)
段错误发生在这里:
for( unsigned int i = 0; i < strings.size() - 1; ++i ) {
if( strings[i].compare(strings[i+1]) == 0 ) {
问题是您将无符号值 i
与从 strings.size() - 1
返回的无符号值进行比较。当 strings.size()
为 0
时,这部分 i < strings.size() - 1
将检查 i
是否小于最大整数值,这(基本上)总是为真。
这会导致 strings[i+1]
在 strings
的长度为 0 或 1 时出现段错误。
这可以通过多种方式修复,但 for( int i = 0; i < (int)strings.size() - 1; ++i ) {
是一种快速而肮脏的修复方法。