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

C++ 如何用链表替换std::vector?,c++,linked-list,std,stdvector,stdlist,C++,Linked List,Std,Stdvector,Stdlist,我使用了std::vector来制作我的算法。我想用链表替换向量 为了做到这一点,我考虑使用std::list,但我不知道如何做到这一点,例如,我尝试了以下示例来查找向量/列表中的值: void find_values_in_vector(const std::vector<int>& input_vector, int value, int &rv1, int &rv2) { if (input_vector[0] >= value) { // t

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

为了做到这一点,我考虑使用
std::list
,但我不知道如何做到这一点,例如,我尝试了以下示例来查找向量/列表中的值:

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;
}
void查找向量中的值(常量std::向量和输入向量,int值,int和rv1,int和rv2)
{
如果(输入_向量[0]>=值){//太小
rv1=0;rv2=0;返回;
}
int index=(int)input_vector.size()-1;

如果(input_vector[index]遍历容器的标准方法如下:

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

这也适用于整个STL容器。

遍历容器的标准方法如下:

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

这也适用于整个STL容器。

这适用于vector、list、deque和set(假设内容已排序)

模板
在容器(常量T和容器、int值、int和rv1、int和rv2)中无效查找值
{
rv1=rv2=0;//初始化
if(container.empty()| | container.front()>=值)
{
返回;
}
用于(const auto&v:container)
{
rv2++;
如果(v>值)
{
打破
}
rv1++;
}
返回;
}

这应该适用于vector、list、deque和set(假设内容已排序)

模板
在容器(常量T和容器、int值、int和rv1、int和rv2)中无效查找值
{
rv1=rv2=0;//初始化
if(container.empty()| | container.front()>=值)
{
返回;
}
用于(const auto&v:container)
{
rv2++;
如果(v>值)
{
打破
}
rv1++;
}
返回;
}

stl中的所有容器都是一样的:您主要使用迭代器来导航它们。如果您来自其他语言,这会有点习惯,但它非常整洁,因为它在所有地方都是一致的。顺便问一下,有什么原因吗?为什么切换到列表?向量在大多数情况下更好。如果使用整数进行索引(但不是
std::list
),使其成为
size\u t
,而不是
int
。与stl中的所有容器一样:您主要使用迭代器来导航它们。如果您来自其他语言,这会有点习惯,但它非常整洁,因为它在所有地方都是一致的。顺便问一句,有什么原因。为什么要切换到列表?向量在大多数情况下更好。如果带整数的索引(而不是
std::list
)另外一个问题:我之所以选择向量,是因为它的第n个元素很容易得到,但是使用列表意味着需要一个迭代器,但我不明白这一点:在使用迭代器
it
时,如果你使用
it++
n次,那么y您将进入第n个元素。
it+n
为什么不起作用?这不一样吗?++运算符重载并创建此行为。您可以使用
std::advance
迭代器执行您想要的操作,这取决于迭代器的类型。向量具有随机访问迭代器,这就是为什么您可以使用indexes、 列表没有,这就是为什么你必须将它推进n次。但是,如果有疑问,请使用
++it
,而不是
it++
:它可能避免复制迭代器。@kubanrob就在这里。我故意省略了这一点,以免混淆太多,使它看起来像大多数编程语言中的典型for循环。但是
++it
就是我们一个额外的问题:我选择vectors是因为它的第n个元素很容易得到,但是使用列表意味着需要一个迭代器,但我不理解这一点:似乎在使用迭代器
it
时,如果你使用
it++
n次,那么你将得到第n个元素ent.
it+n
为什么不工作?这不一样吗?++运算符重载并创建此行为。可以使用
std::advance
迭代器执行您想要的操作,这取决于迭代器的类型。向量具有随机访问迭代器,这就是为什么您可以使用索引。列表没有,这就是为什么y您必须将其前进n次。但是,如果有疑问,请使用
++it
而不是
it++
:这样可以避免复制迭代器。@kubanrob就在这里。我故意忽略了这一点,以避免混淆太多,使其看起来像大多数编程语言中的典型for循环。但是
++it
通常是一种更好的做法。
template <class T>
void find_values_in_container(const T& container, int value, int &rv1, int &rv2)
{
  rv1 = rv2 = 0;  // Initialize
  if (container.empty() || container.front() >= value)
  {
    return;
  }
  for (const auto& v : container)
  {
     rv2++;
     if (v > value)
     {
         break;
     }
     rv1++;
  }
  return;
}