0

このマルチマップの実装をC++で作成しようとしましたが、values.size()が正解を返したとしても、ベクトル「values」にアクセスしようとするとセグメンテーション違反が発生します。

22行目でセグメンテーション違反が発生していることは知っていますが、理由はわかりません。助けていただければ幸いです。

#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
template<class DT1,class DT2>
class Pair
{
public:
  Pair(DT1 key_in, DT2 value_in) 
  {
     key = key_in;
     values.push_back(value_in);
  }
  DT1 key;
  vector<DT2> values;
  int insert_value(DT2 item)
  {
     bool value_found = false;
     cout << "values size "<<values.size() << endl;

     cout << "test " << values[0] << endl;

     for (unsigned int i = 0; i < values.size(); i++)
     {
         cout <<"i " << i << endl;
         if (values[i] == item)     
            value_found = true;
     } 

  if (value_found == false)
  {
      cout<<"not found"<<endl;
      values.push_back(item);
  }

  return 0;
  }
};

template<class T1, class T2>
class MultiMap
{
public:
   MultiMap() {};
   vector<Pair<T1, T2> > pair_container;
   int insert(T1 key_in, T2 value_in)
   {
       bool key_found = false;
       unsigned int i;
       for (i = 0; i < pair_container.size(); i++)
       {
           if (pair_container[i].key == key_in)
       key_found = true;
       }   
       if (key_found == false)
           pair_container.push_back(Pair<T1,T2>(key_in, value_in));
       if (key_found == true)
       {
            pair_container[i].insert_value(value_in); // seg fault
       }
   return 0;
   }

   };

int main()
{
MultiMap<char, string> Map1;
Map1.insert('a', "anchor");
cout << Map1.pair_container[0].values[0] << endl;
Map1.insert('a', "application"); // seg fault
cout << "hello!"<<endl;
Map1.insert('b', "boolean");
return 0;
}
4

2 に答える 2

4

正しいベクトルを見つけたら、ループからbreak抜け出す必要があります。for

すなわち:

   unsigned int i;
   for (i = 0; i < pair_container.size(); i++)
   {
       if (pair_container[i].key == key_in)
       {
           key_found = true;
           break; // If you don't break out, i will always be one larger than size().
       }
   }   

ブレークアウトしない場合key_foundは、ベクトルの終わりを過ぎたtrueものiを参照するため、セグメンテーション違反につながるメモリ破損の問題が発生します。

于 2012-05-01T15:49:45.950 に答える
0

あなたが書くとき

 cout << "values size "<<values.size() << endl;

values何かを含むものをテストしています。しかし、あなたが書くとき

 cout << "test " << values[0] << endl;

含まれているものが正しいと想定しています。

の最初のオブジェクトはvalues? セグメンテーションフォルトの原因のようです。例を挙げましょう。ポインターまたは参照のベクトルがあり、 を追加する0x11と、最初の出力は になります1。しかし、どこを0x11指すのですか?

于 2012-05-01T15:59:07.083 に答える