【问题标题】:Insertion sort using a list STL recursively递归地使用列表 STL 进行插入排序
【发布时间】:2018-10-14 21:54:54
【问题描述】:

所以我正在尝试将这个向量代码修改为列表。我了解向量,但对列表来说相当新。这是我迄今为止尝试过的,我该如何解决这个问题请告诉我。 这是原始向量代码:

void insertion_sort(std::vector <int> &num) {
int i, j, key;
bool insertionNeeded = false;

for (j = 1; j < num.size(); j++) {
    key = num[j];
    insertionNeeded = false;
    for (i = j - 1; i >= 0; i--) { // larger values move right

        if (key < num[i]) {
            num[i + 1] = num[i];
            insertionNeeded = true;
        }
        else
            break;
    }
    if (insertionNeeded)
        num[i + 1] = key;    //Put key into its proper location
}
}

这是我尝试转换为列表的代码: 运行时出现错误

void insertion_sort(list<int> &li) {
int i, j, key;
bool insertionNeeded = false;
list<int>::iterator itr = li.begin();
for (j = 1; j < li.size(); j++) {
    advance(itr, j);
    key = *itr;
    insertionNeeded = false;
    for (i = j - 1; i >= 0; i--) { // larger values move right
        advance(itr, i);

        if (key < i) {
            advance(itr, i + 1);
            int temp1 = *itr;
                 advance(itr, i);
                 int temp2 = *itr;

                 temp1 = temp2;
            insertionNeeded = true;
        }
        else
            break;
    }
    if (insertionNeeded)
        advance(itr, i + 1);
        *itr = key;
}
}

【问题讨论】:

  • 那么,你遇到了什么错误?
  • iter 不可取消引用
  • 你从哪里得到它?来吧。你必须在这里帮助我们。
  • if (insertionNeeded) Advance(itr, i + 1); *itr = 键; //这里
  • 我是列表新手,所以我需要帮助将代码从向量转换为列表

标签: c++ c++11 insertion-sort


【解决方案1】:

这是我的快速回答。 测试代码为here

注意std::advance 修改了它的参数。 OTOH,std::next 保持其参数不变。

void insertion_sort(std::list<int> &li)
{
    for (auto j = 1U; j < li.size(); ++j) 
    {
        auto itr = li.begin();
        std::advance(itr, j);
        const auto key = *itr;

        for (auto i = j; i > 0U; --i) // i is just a counter.
        {        
            std::advance(itr, -1);

            if (key < *itr) // larger values move right
            {
                const int temp = *itr;
                *itr = key;
                *std::next(itr) = temp;        
            }
            else{            
                break;
            }
        }
    }
}

【讨论】:

  • 谢谢!一个问题,虽然那些 1U、0U 值是什么?
  • U 表示unsigned int。我简要地使用它来避免比较有符号和无符号整数时的警告。我通常使用std::size_t。 C++ 标准说std::vector::size 返回无符号整数类型,但没有指定返回哪一个。我认为这篇文章会有所帮助,stackoverflow.com/questions/7636323/c-vector-size-types
猜你喜欢
  • 2012-11-17
  • 1970-01-01
  • 2012-02-29
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多