#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;
}
}
这个程序运行不正常,背后可能的原因是什么?
此外,我想要排序对向量,其中排序由值完成。
答案 0 :(得分:3)
分配给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;
}
答案 1 :(得分:0)
与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);