这个程序崩溃了,为啥?

Posted

技术标签:

【中文标题】这个程序崩溃了,为啥?【英文标题】:This program is crashing, why?这个程序崩溃了,为什么? 【发布时间】:2016-08-28 12:34:03 【问题描述】:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()

    vector<pair<int,int> > arr;
    arr[0].first=20,arr[0].second=1;
    arr[1].first=3,arr[1].second=2;
    arr[2].first=230,arr[2].second=3;
    arr[3].first=230,arr[3].second=4;
    arr[4].first=202,arr[4].second=5;
    arr[5].first=-20,arr[5].second=6;
    sort(arr.begin(),arr.end());
    vector<pair<int,int> >::iterator it;
    for(it=arr.begin();it!=arr.end();it++)
    
        cout<<it->first<<it->second<<endl;
    

此程序运行不正常,这可能是什么原因? 我也想有排序的对向量,其中排序是由值完成的。

【问题讨论】:

vector&lt;pair&lt;int,int&gt; &gt; arr(6); 应该可以解决问题。 每个问题一个问题。 使用默认构造函数创建向量时,向量为empty。任何索引都将超出范围并导致未定义的行为 【参考方案1】:

分配给vector 不会分配内存。 通常我们使用push_back来添加具有自动记忆的项目 分配。像你通常这样写的代码:

arr.push_back(pair<int, int>(20, 1));
arr.push_back(pair<int, int>(3, 2));

等等。

但现在使用 C++11,这种编码风格已经过时了。 可以这样做(另请参阅循环):

arr.push_back( 20, 1 );
arr.push_back( 3, 2 );
sort(arr.begin(), arr.end());
for (auto p : arr)

    cout << p.first << p.second << endl;

实际上,C++11 在构造函数中加入了一些方便的语法:

vector<pair<int, int> > arr  20, 1 ,  3, 2 ,  230, 3 ,
 230, 4 ,  202, 5 ,  -20, 6  ;
sort(arr.begin(), arr.end());
for (auto p : arr)

    cout << p.first << ", " << p.second << endl;

【讨论】:

"vector >" - 同样在 C++11 中,右尖括号之间的空格不再需要。但是,template &lt;boo&gt; struct d; d&lt;(1&gt;2)&gt; x;...【参考方案2】:

map::operator[] 不同,vector::operator[] 从不向容器中自动插入新元素。访问不存在的元素是未定义的行为(在调试模式下,运行时可能会抛出一个断言来帮助调试)。

在 C++11 中,最有效的填充向量的方法是:

通过初始化列表:

  vector<pair<int, int>> arr 
      20, 1 ,    3, 2 ,  230, 3 ,
     230, 4 ,  202, 5 ,  -20, 6  ;

或者就地创建条目:

  vector<pair<int, int>> arr;
  arr.reserve(6); // optional, is just for efficiency
  arr.emplace_back( 20, 1);
  arr.emplace_back(  3, 2);
  arr.emplace_back(230, 3);
  arr.emplace_back(230, 4);
  arr.emplace_back(202, 5);
  arr.emplace_back(-20, 6);

【讨论】:

为什么不是通过ctor分配内存也是“最有效”的方式? 你的意思是arr(6);?这不仅仅是分配内存,它还默认构造了 6 个元素。当然,pair&lt;int,int&gt; 默认构造函数是无操作的,该方法仍然更容易出错(如果不是随后设置每个元素,则使用未初始化值的风险)。如果默认构造函数确实初始化了元素,那将是浪费。

以上是关于这个程序崩溃了,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个程序崩溃

为啥这个程序会崩溃? [关闭]

为啥我的程序在管理这个 JSON 文件时会崩溃?

为啥这个 C 程序会崩溃?它编译得很好[重复]

为啥我的签名 apk 崩溃了?

为啥这个程序会崩溃:在 DLL 之间传递 std::string