【问题标题】:Creating A Random Iterator (Permutation)创建一个随机迭代器(排列)
【发布时间】:2016-05-02 03:28:59
【问题描述】:

这个项目的最后一个大障碍,我希望你们能帮助我,因为我再次陷入困境。我正在处理的是一个动态分配的模板化容器,所有代码都是从头开始编写的,带有一个常量迭代器,以及一个随机迭代器,它以索引数组的形式生成排列。到目前为止,我已经让它正确地生成索引,但是我不确定如何让随机迭代器使用该索引数组在它们中移动。我认为随机迭代器的 ++ 运算符存在问题,但我完全不确定该怎么做才能使其正确迭代。以下是一些sn-ps:

// Implementation of the rand_iterator method when provided a seed  by   
// the user. rand_iterator takes a pointer to a container object, and the seed // as parameters.
template <class T>
typename sorted<T>::rand_iterator sorted<T>::rndbegin(unsigned seed){
  return rand_iterator(this, seed);
}

// Implementation of the const iterator pre-incrementer.
template <class T>
typename sorted<T>::const_iterator sorted<T>::const_iterator::operator++(){ ++m_current; return *this; }


// This is what my rndbegin looks like at the moment.
// Implementation of the rand_iterator rndbegin method.
template <class T>
typename sorted<T>::rand_iterator sorted<T>::rndbegin(){
  sorted<T>::rand_iterator newrand(this);
  return newrand;
}

// Implementation of the non-default rand iterator constructor given 
// a user-defined seed.
template <class T>
sorted<T>::rand_iterator::rand_iterator(sorted<T>* srtdPtr, unsigned seed){

  int j;
  m_rsize = srtdPtr->m_size;

  // Set up the random seed.
  // Allocate memory for m_random.
  srand(seed);
  m_random = new int[m_rsize];

  // Fill the randomized array with values.
  for (int i = 0; i < srtdPtr->m_size; i++)
    m_random[i] = i;

  // Randomize the values.
  for (int i = 0; i < srtdPtr->m_size; i++){

    T temp;

    j = rand() % (srtdPtr->m_size);
    temp = m_random[i];
    m_random[i] = m_random[j];
    m_random[j] = temp;
  }

  // Just testing to make sure the random array
  // is set up properly; it is. 
  cout << "Random seed test:" << endl;
  for (int i = 0; i < srtdPtr->m_size; i++)
    cout << m_random[i] << " ";
  cout << endl;

  m_current = 0;
  m_randPtr = srtdPtr;
}

// Implementation of the dereference operator.
template <class T>
const T& sorted<T>::rand_iterator::operator*(){
  return m_randPtr->m_data[m_random[m_current]];
}

// Some code from main that's causing an issue.
// ritr3 was already created and tested.
sorted<int>::rand_iterator ritr5(ritr3);

cout << "Printing copy constructed random index array - should print: 5 16 1 7 9 17 7 4 6" << endl;
cout << "Actually prints: " << endl;
for (ritr5 = x.rndbegin(4242); ritr5 != x.rndend(); ritr5++)
  cout << *ritr5 << " ";
cout << endl;

【问题讨论】:

    标签: c++ random iterator permutation


    【解决方案1】:

    m_current 成为m_crandom 的索引,并让它从0 变为n,那么m_crandom[m_current] 将成为实际数据数组的打乱索引。

    这是一个展示基本思想的例子:

    http://coliru.stacked-crooked.com/a/47b28c0be0bcd027

    【讨论】:

    • 感谢您的帮助!不过,我不确定我是否知道如何实施您的建议。
    • 等等,你是说我应该只将 m_current 设为 rand_iterator 类的 int 而不是指针,这样当它递增时,我可以使用它来索引整个数组?有道理,我试试看。
    • 是的,我就是这个意思。
    • 我现在明白了。但是,rand_iterator 是模板化容器类中的一个类,而 m_data(它是包含数据的实际数组)是容器类的私有成员。因此,当我让解引用运算符返回 m_data[m_crandom[m_current]] 时,我得到了无效使用非静态数据成员错误。
    • 这实际上并不是您的 rand_iterator 所特有的,任何迭代器都需要有一种方法来引用容器的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多