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;
}