0

我尝试在 C++ 中实现多映射,但是在尝试访问向量“值”时遇到了段错误,即使 values.size() 返回了正确的答案。

我知道段错误发生在第 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

IE:

   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将是truei将引用超过向量末尾的一个,因此您将遇到导致分段错误的内存损坏问题。

于 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 回答