c++ - 如何用链表替换 std::vector?

标签 c++ linked-list std stdvector stdlist

我使用 std::vector 来制作我的算法。我想用链表替换 vector 。

为了做到这一点,我正在考虑使用 std::list,但我不知道该怎么做,例如,我尝试了以下示例以在 vector/列表:

void find_values_in_vector(const std::vector<int>& input_vector, int value, int &rv1, int &rv2)
{
  if (input_vector[0] >= value) { // too small
    rv1 = 0; rv2 = 0; return;
  }
  int index = (int)input_vector.size() - 1;
  if (input_vector[index] <= value) { // too big
    rv1 = index; rv2 = index; return;
  }
  // somewhere inside
  index = 0;
  while (input_vector[index] <= value) {
    index++;
  }
  rv1 = index - 1; rv2 = index; return;
}

void find_values_in_list(const std::list<int>& input_list, int value, int &rv1, int &rv2)
{
  if (*input_list.begin() >= value) { // too small
    rv1 = 0; rv2 = 0; return;
  }
  if (*input_list.end() <= value) { // too big
    rv1 = (int)input_list.size() - 1; rv2 = (int)input_list.size() - 1; return;
  }
  // somewhere inside
  int index = 0; int temp = *input_list.begin();
  while (temp <= value) {
    temp = *input_list.next(); index++;
  }
  rv1 = index - 1; rv2 = index; return;
}

这似乎不起作用,因为成员函数 next() 不存在。但是我记得浏览链表是通过从头开始,然后进一步移动到下一个元素直到到达某个点来完成的。我已经看到有一种方法可以通过在 for 循环中使用 interator 来完成此操作,但我想知道我的方法有什么问题?我的印象是 std::list 是双向链表的标准实现,或者我错了,在那种情况下,什么是 std 类链表的实现(不一定是双向链表)?

最佳答案

遍历容器的标准方式是这样的:

for(std::list<int>::iterator it = input_list.begin();
    it != input_list.end();
    it++)
{
    ....
}

这也适用于 vector 、 map 、双端队列等。迭代器概念在整个 STL 中得到一致实现,因此最好习惯这个概念。

对于不同类型的迭代器,还有像 std::distancestd::advance 等迭代器操作(我建议你阅读它们和它们的优势/局限性)

如果您有可用的 C++ 11,您也可以使用此语法(尽管可能对您的问题没有用。)

for(const auto& value : input_list)
{
   ...
}

这也适用于整个 STL 容器。

关于c++ - 如何用链表替换 std::vector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39385429/

相关文章:

c++ - 为什么没有 <STLfwd> header ,它的不存在可以被视为缺陷吗?

c++ - Boost::网络信号封装

c++ - Vector 有 2 亿个项目

java - Java中使用链表按ID号升序

data-structures - `set-car!` 的 `cdr` 也改变了 `car`,为什么?

C 链表/-> 运算符

c++ - 调用 vector.erase() 时出现段错误

c++ - 删除还是虚拟删除?

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - 通过只读迭代器公开成员数据