C++ 将元素复制到新列表中

标签 c++ list

我在将列表的某些元素复制到新列表时遇到问题。它必须在一个条件下完成:可以复制的元素必须来自输入的范围。问题是每个元素都被复制到新列表中。有什么建议么?我想指出我的英语并不完美,但我希望你能明白。谢谢:)

struct Node
{
    Node* next;
    int data;
};

struct List
{
    Node* head;
    Lista();
    void push(int);
    void addafter(int, int);
    void delchosen(int);
    void pop();
    void print();
    int count();
    Node* find(int);
    void pushback(int);
    void popback();
    void minmax(int&, int&);
    List* range(int, int);
};

List::List()
{
     head = NULL;
}
void List::push(int value)
{
     Node *p = new Node;
     p->data = value;
     p->next = head;
     head = p;
}
List* List::range(int x, int y)
{
    Node* e = head;
    List* newlist = new List;

    while(e)
    {
        if(e->data > x && e->data <y)
        {
            newlist->push(e->data);
        }
        e = e->next;
    }
    return newlist;
}

int main()
{
    List l;
    srand(time(NULL));
    const int size = 30;
    int* arr = new int [size];
    for(int i=0; i<size; i++)
        {
        arr[i]=rand()%20+1; 
        l.push(arr[i]);
        }
    l.range(3, 10);
    return 0;
}

认为没有必要,但我刚刚编辑了代码。除了这个复制之外,每个函数都可以正常工作。

最佳答案

您永远不会使用新列表。那可能会误导你。例如,您可以在调试器中打印或观察旧列表,它仍然包含所有值。有时所有的程序员都会发生这种情况,从新生到长 mustache 的老专家。

否则代码应该可以工作:

auto newList = l.range(3, 10);
newList->print();

奖励:一般代码审查。

  • 如果用确定性值而不是随机内容填充列表,调试和测试代码可能会更容易:

    for (int i = 0; i < size; i++) {
        l.push(i);
    }
    
  • 很可能您不需要在堆上分配 newlist。使用堆栈分配:

    List List::range(int x, int y) const {
        ...
    
            List newlist;
        ...
            newlist.push(...);
        ...
            return newlist;
    }
    
  • 虽然这对于自学和各种黑客攻击来说很好也很有趣,但您应该避免在严肃的代码中使用自制链表。在 C++ 中,我们倾向于使用标准库设施。像这样的东西:

    #include <iostream>
    #include <iterator>
    #include <list>
    
    int main() {
        // Construct original list from brace-initializer list
        std::list<int> original{ 1, 2, 3, 4, 5, 6, 7 };
    
        // Get the beginning of the new list by advancing
        //          beginning of the original list by 2 elements
        auto begin = original.cbegin();
        std::advance(begin, 2);
    
        // Get the end of the new list by advancing
        //          beginning of the original list by 5 elements
        auto end = original.cbegin();
        std::advance(end, 5);
    
        // Construct sublist  from iterator range
        std::list<int> sublist(begin, end);
    
        // Print new list
        for (auto&& e : sublist)
            std::cout << e << ' '; // prints "3 4 5"
    }
    

关于C++ 将元素复制到新列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30968509/

相关文章:

javascript - 使用nodejs在windows中读取进程的内存值

java - 从列表中删除项目/在列表中搜索项目

python从两个列表中创建一个新列表,第二个列表表示重复第一个列表中的元素多少次

c++ - 具有概率估计的多类图像分类

c++ - 如何在 GPU 上运行子弹物理解决方案

c++ - 将 C++ 流用于 cout 或文本文件

r - 从数据帧列表中获取名称与 id 连接的向量

c++ - 转换字符串标记流时如何避免重复istringstream构造

C# 使用 List<T> 属性初始化类

java - 为什么 Java 设计者不制作这样的列表 ---new ArrayList ("1","2")