пересечение строк в векторах, дающих ошибку сегментации - PullRequest
0 голосов
/ 17 сентября 2018

Я написал программу для суммирования, если хотя бы один символ является общим в векторе строки в c ++, для этого я использовал функцию set_intersection. Я получаю ошибку сегментации, не знаю почему.

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int matching_characters(string s1, string s2);

int main()
{
    string s;
    vector<string> ss;
    int n,sum=0,avg=0;
    cout<<"enter no in group"<<endl;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin >> s;
        ss.push_back(s);

    }
   // cout<<ss[1];

 // cout<<ts[1];
 for(int i=1;i<=n;i++)
 {

    for(int j=1;j<=n;j++)
    {
     if(i==j)
     continue;
    int t=matching_characters(ss[i], ss[j]);
    cout<<t;
    if(t!=0)
     sum=sum+1; 
    }
 }

    cout<<"'s='"<<sum<<endl;
    //avg=sum/n;
    //cout<<avg;
     return 0;
}

int matching_characters(string s1, string s2) {
  sort(s1.begin(), s1.end());
  sort(s2.begin(), s2.end());
  string intersection;
  set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(),
                        back_inserter(intersection));
  return intersection.size();
}

enter image description here

1 Ответ

0 голосов
/ 17 сентября 2018

Я думаю, что

for(int i=1;i<=n;i++)
{
    for(int j=1;j<=n;j++)
    {
        if(i==j)
            continue;

было бы лучше записать как

for(int i=0;i<n;i++)
{
    for(int j=i+1;j<n;j++)
    {

Учитывая, что массив n объектов имеет действительные индексы [0]...[n-1], мы начинаем с0 в первом цикле, и мы прекращаем итерацию до того, как доберемся до недопустимого индекса n.Для эффективности мы запускаем второй цикл в точке, которая пропускает более половины сравнений.(Нет смысла сравнивать A с A, и после сравнения A с B нет смысла сравнивать B с A.)

...