c++ 迭代器数组的奇怪行为

标签 c++ arrays iterator

所以搜索看看是否有人已经问过这个问题,我看到很多关于遍历数组的问题。但我得到的是一个迭代器数组。基本上这就是我要做的:

我有一个自定义对象的排序 std::list。该对象仅包含一个 int 和一个 double,并且具有用于您期望的各种事物的方法(构造函数、setter、getter、operator< 使其可按 double 排序,toSting() 方法)。一切正常,包括排序。

现在我想要一堆在不同点指向列表的迭代器。将有一个指向列表的头部,一个指向列表的尾部,还有几个指向中间的各个点。我正在使用旧式数组执行此操作(这可能是问题所在 - 我将使用 std::array 进行尝试,但我仍然想了解为什么这不起作用)。所以我有一个初始化这个数组的子程序。它几乎可以工作。我可以在子例程中构建数组和输出,一切看起来都不错。从子例程外部输出数组的最后一个元素已更改并且不再指向列表。这是相关代码:

using namespace std;

#include <iostream>
#include <list>
#include <cmath>
#include <algorithm>
#include "random.h"
#include "Double_list_struct.h"

/**********************************Subroutine declarations***************************/

template <typename Tplt>
void output_list(list<Tplt> to_out);
template <typename Tplt>
void initialize_list(list<Tplt> &alist, int size);
template <typename Tplt>
void initialize_iter_array(typename list<Tplt>::iterator* itar, int size, list<Tplt> alist);

/***************************************Main routine*******************************/

int main(void)
{
  int list_size = 16;

  // Make the list that will be tested.
  list<Double_list_struct> list_to_play_with;

  initialize_list(list_to_play_with, list_size);

  list_to_play_with.sort();
  cout << "Sorted list is: " << endl;
  output_list(list_to_play_with);

  // Make an array of list<Double_list_struct>::iterator of size floor(sqrt(N))
  int iter_array_size = floor(sqrt(list_size));

  list<Double_list_struct>::iterator* iter_array;
  iter_array = new list<Double_list_struct>::iterator[iter_array_size];

  // Initialize the iterators in iter_array to point to roughly evenly spaced locations in the list

  initialize_iter_array(iter_array, iter_array_size, list_to_play_with);

  for (int i = 0; i < iter_array_size; i++)
    {
      cout << "In main routine, iter_array[" << i << "]:" << (*(iter_array[i])).toString() << endl;
    }

  cout << "Reset it, and redo the output loop??" << endl;
  iter_array[iter_array_size-1] = list_to_play_with.end();
  iter_array[iter_array_size-1]--;

  for (int i = 0; i < iter_array_size; i++)
    {
      cout << "In main routine, iter_array[" << i << "]:" << (*(iter_array[i])).toString() << endl;
    }    
}


/************************************************Subroutine code**************************************/

// Output all elements of a list to cout.

template <typename Tplt>
void output_list(list<Tplt> to_out)
{
...not important here
}


template <typename Tplt>
void initialize_list(list<Tplt> &alist, int size)
{
...not important here
}


template <typename Tplt>
void initialize_iter_array(typename list<Tplt>::iterator* itar, int size, list<Tplt> alist)
{
  itar[0] = alist.begin();
  itar[size-1] = alist.end();
  itar[size-1]--; // Recall that .end() makes an iterator point *past* the end...

  // Find out how big the list is
  int listsize = 0;
  for (typename list<Tplt>::iterator it = itar[0]; it != itar[size-1]; it++)
    {
      listsize = listsize + 1;
    }

  int spacing = floor(listsize/(size-1));

  cout << "In initialize_iter_array(): created itar[0]: " << (*itar[0]).toString() << endl;

  for (int i = 1; i < size-1 ; i++)
    {
      itar[i] = itar[i-1];

      for (int j = 0; j < spacing; j++)
    {
      itar[i]++;
    }
      cout << "In initialize_iter_array(): created itar[" << i << "]: " << (*itar[i]).toString() << endl;
    }

  cout << "In initialize_iter_array(): created itar[" << size-1 << "]: " << (*itar[size-1]).toString() << endl;
}

这会生成输出

Sorted list is: 
struct[15] = 0.135837
struct[1] = 0.200995
struct[12] = 0.217693
...SNIP...
struct[8] = 0.863816
struct[14] = 0.887851
struct[2] = 0.893622
struct[10] = 0.925875
In initialize_iter_array(): created itar[0]: struct[15] = 0.135837
In initialize_iter_array(): created itar[1]: struct[5] = 0.314127
In initialize_iter_array(): created itar[2]: struct[11] = 0.704419
In initialize_iter_array(): created itar[3]: struct[10] = 0.925875
In main routine, iter_array[0]:struct[15] = 0.135837
In main routine, iter_array[1]:struct[5] = 0.314127
In main routine, iter_array[2]:struct[11] = 0.704419
In main routine, iter_array[3]:struct[-1] = 6.21551e-71
Reset it, and redo the output loop??
In main routine, iter_array[0]:struct[15] = 0.135837
In main routine, iter_array[1]:struct[5] = 0.314127
In main routine, iter_array[2]:struct[11] = 0.704419
In main routine, iter_array[3]:struct[10] = 0.925875

所以,你看,iter_array[3] 在初始化子程序中是正确的,但在子程序退出后“移动”了。然后我从子例程之外重置它,但显然我不想这样做......

我最好的猜测是这里有一些关于赋值运算符如何为迭代器工作的微妙之处。但是我很困惑。

最佳答案

initialize_iter_array 按值获取列表,这意味着它将指向列表参数拷贝的迭代器,而不是原始列表。您可能打算改为通过 const& 传递列表。

关于c++ 迭代器数组的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21489062/

相关文章:

arrays - 在postgresql中将列从字符串更改为字符串数组

c++ - 删除一个外部迭代器

c++ - 沿任一方向遍历容器并删除元素

python - 跨 python 进程共享扩展分配的数据结构

c++ - 初始化指向数组 C++ 的指针

php - 在 PHP 中从数据库查询创建多维数组

arrays - swift TableView

c++ - 如何在头文件和源文件中组织模板函数和函数

c++ - 对重载函数的模糊调用 - log 与 ptrdiff_t

c++ - 一般来说,什么是迭代器?