【问题标题】:C++0x array to iterator without using begin/end不使用开始/结束的 C++0x 数组到迭代器
【发布时间】: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 &lt;int, int&gt;[4] vect;,不确定这是否相关。

因此我的问题。 begin()end() 是否有替代品,还是我应该坚持使用 vector 来解决我的问题?

编辑:为清楚起见,在第二个代码示例中将变量名称从 vect 更改为 p_arr

【问题讨论】:

  • sort(vect, vect + 4)。虽然目前尚不清楚您希望通过手动分配内存(顺便说一下,泄漏)而不是让std::vector 为您分配相同的内存来获得什么。
  • 哦,end(vect) 实际上不起作用(在第二个示例中),因为vect 不知道它的大小。 std::end() 适用于正确的数组(除其他外),而不是指针。
  • @Melvin - 是的,你确实有一个严重的误解。手动分配内存本身并不能使您的程序更有效率。考虑到编译器标准库中专业制作的容器和分配器之间的选择,以及简单的“手工操作使其更高效”,我敢打赌标准容器会更高效——几乎可以衡量任何效率。而且,当然,让代码在标准容器中正常工作(适当地释放内存等)比手动操作更容易。
  • “我们得到的作业代码到处都有malloc,所以我认为导师很喜欢它们” 尽快逃跑。留下this作为线索...

标签: c++ arrays iterator c++03


【解决方案1】:

对于T[N] 类型的数组a,您可以轻松地将“开始”和“结束”分别设为aa+N,您可以毫无问题地替换它们。

也就是说,将 beginend 从 C++11 反向移植到 C++03 非常容易。我自己使用 cppreference 中的information about the functions 作为指导完成了。

【讨论】:

    猜你喜欢
    • 2018-04-13
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多