【发布时间】:2018-08-02 13:59:50
【问题描述】:
如何在不使用 std::begin() 和 std::end() 的情况下将 C++ 数组对转换为迭代器?
上下文: 我正在尝试使用第一个元素(可以假设是唯一的)对一组对进行排序。按照说明here,其中使用了向量:
int main()
{
vector<pair <int,int>> vect;
int arr[] = {10, 20, 5, 40 };
int arr1[] = {30, 60, 20, 50};
for (int i=0; i<4; i++)
vect.push_back(make_pair(arr[i],arr1[i]));
sort(vect.begin(), vect.end());
return 0;
}
虽然我事先知道数组的大小,所以(除了在vect 上调用resize 之外)我想做一些类似的事情:
int main()
{
auto *p_arr = (pair<int, int>*) malloc(4 * sizeof(pair<int, int>));
int arr[] = {10, 20, 5, 40 };
int arr1[] = {30, 60, 20, 50};
for (int i=0; i<4; i++)
p_arr[i] = make_pair(arr[i],arr1[i]);
sort(begin(p_arr), end(p_arr));
return 0;
}
但是,C++0x 没有begin() 和end()。另外,我的实际代码在函数中定义了这个,数组的大小由外部提供,所以我也不能做pair <int, int>[4] vect;,不确定这是否相关。
因此我的问题。 begin() 和 end() 是否有替代品,还是我应该坚持使用 vector 来解决我的问题?
编辑:为清楚起见,在第二个代码示例中将变量名称从 vect 更改为 p_arr。
【问题讨论】:
-
sort(vect, vect + 4)。虽然目前尚不清楚您希望通过手动分配内存(顺便说一下,泄漏)而不是让std::vector为您分配相同的内存来获得什么。 -
哦,
end(vect)实际上不起作用(在第二个示例中),因为vect不知道它的大小。std::end()适用于正确的数组(除其他外),而不是指针。 -
-
@Melvin - 是的,你确实有一个严重的误解。手动分配内存本身并不能使您的程序更有效率。考虑到编译器标准库中专业制作的容器和分配器之间的选择,以及简单的“手工操作使其更高效”,我敢打赌标准容器会更高效——几乎可以衡量任何效率。而且,当然,让代码在标准容器中正常工作(适当地释放内存等)比手动操作更容易。
-
“我们得到的作业代码到处都有malloc,所以我认为导师很喜欢它们” 尽快逃跑。留下this作为线索...