【问题标题】:Sort Vector in a Map c++在地图 C++ 中对向量进行排序
【发布时间】:2013-08-27 18:09:00
【问题描述】:

我正在尝试对地图中的一些向量进行排序,但是当我运行程序时出现分段错误。

typedef map<int, vector<int> > Map;
Map m;
for (Map::iterator it = m.begin(); it != m.end(); ++it) {
  sort(it->second.begin(), it->second.end());
}

就在排序之前,我有一个插入数据的部分:

int x = 2;
int y = 3;
map<int, vector<int> >::iterator itTemp;

itTemp = FontaneMapX.find(x);
if (itTemp == m.end())
    itTemp = m.insert(make_pair(x,vector<int>())).first;
itTemp->second.push_back(y);

在本节之后我不会删除/添加项目,而不是地图内的矢量事件。

对我应该改变什么有什么想法吗?

【问题讨论】:

  • 我在这里运行了你的代码ideone.com/wBKuDP,它没有段错误。这不是决定性的,它可能只是偶然的。但我看不出代码有什么问题,所以可能是其他原因导致了错误。
  • 顺便说一句,你也可以这样做,这可能更清楚:vector&lt;int&gt;&amp; vec = m[x]; if (vec.empty()) vec.push_back(y); 如果它不存在,它会使用默认构造函数创建值。
  • @Neil 不需要if (vec.empty()) 测试,它也不会出现在 OP 的代码中。只需执行m[x].push_back(y); - 一行而不是四行。 ;-)
  • 检查地图/矢量是否同时被另一个线程访问?检查您是否有自己的 sort 函数被调用而不是 std::sort
  • 介意显示更多代码吗?我认为您发布的内容没有任何问题。

标签: c++ algorithm sorting vector map


【解决方案1】:

我猜这个实现效果很好 (http://ideone.com/QACBSZ)

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;

map<int ,vector<int> > mp;
map<int, vector<int> >::iterator it;

int main() {
    int n;
    cin >> n;

    for(int i=0;i<n;i++){
        int m;
        cin >> m;
        vector <int> v(m);
        
        for(int j=0; j < m; j++)
            cin >> v[j];
        
        for(int j=0; j < m; j++)
            cout << v[j] << " ";
        
        cout << endl;
    
        mp.insert(make_pair(i,v));
    }

    for(it = mp.begin(); it != mp.end(); it++)
        sort(it->second.begin(), it->second.end());
    

    for(it = mp.begin(); it != mp.end(); it++){
        int l = it->second.size();
        cout << it->first << "th sorted array-> ";
        
        for(int j = 0; j < l; j++)
            cout << it->second[j] << " ";
        
        cout << endl;
    }
    return 0;
}

【讨论】:

    【解决方案2】:

    我怀疑您的程序在排序之前在插入阶段产生了分段错误。

    map<int, vector<int> >::iterator itTemp;
    itTemp = FontaneMapX.find(x);  // should be m.find(x)?
    if (itTemp == m.end())
        itTemp = m.insert(make_pair(x,vector<int>())).first;
    itTemp->second.push_back(y);
    

    如果itTempfind(x) 函数调用设置为m.end(),则会发生分段错误。在这种情况下,尝试调用 itTemp-&gt;second.push_back(y) 会导致段错误。

    该部分应该是

    itTemp = FontaneMapX.find(x);
    if (itTemp == m.end())
    {
        itTemp = m.insert(make_pair(x,vector<int>())).first;
        itTemp->second.push_back(y);
    }
    

    或者更好,

    itTemp = FontaneMapX.find(x);
    if (itTemp == m.end())
    {
        // Insert a vector with one element.
        itTemp = m.insert(std::make_pair(x,vector<int>(/*count*/1, y)));
    }
    

    或使用 C++11,

    itTemp = FontaneMapX.find(x);
    if (itTemp == m.end())
    {
        // Insert a vector with one element.
        itTemp = m.insert(std::make_pair(x, std::vector<int>({y})));  // use initializer list
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      相关资源
      最近更新 更多