Windows Visual Studio C++ 列表列表

Posted

技术标签:

【中文标题】Windows Visual Studio C++ 列表列表【英文标题】:Windows Visual Studio C++ lists of lists 【发布时间】:2019-09-24 04:18:04 【问题描述】:

Windows 列表 发现以下帖子有些帮助,但我仍在苦苦挣扎。

Creating list of lists in c++

我需要的是一个字符串列表。

所以:

#include <list>

typedef list<std::string, allocator<std::string>>> LISTSTR;
typedef list<LISTSTR, allocator<LISTSTR>> LISTLISTSTR;  // uncertain what this is doing?!!?

main()

  LISTLISTSTR records;

  // Add a blank string list to the list

  LISTSTR *rowoffields = new LISTSTR();

  rowoffields->insert(string("Field1"); // also tried new string("Field1")
  records.insert(rowoffields);  // also tried *rowoffields

但这会返回编译错误:

no instance of overloaded function "std::list<_Ty,_Alloc>::insert[with _Ty=std::string, _Alloc=std::allocator<std:string>]" matches the argument list
argument types are (std::string)  // or types are (std::string*) if using new string("Test")
object type is: LISTSTR
no instance of overloaded function "std::list<_Ty,_Alloc>::insert[with _Ty=LISTSTR, _Alloc=std::allocator<LISTSTR>]" matches the argument list
argument types are (LISTSTR*)  // or types are (LISTSTR) if using *rowoffields
object type is: LISTLISTSTR

【问题讨论】:

我想我错过了这个插入(rowoffields.end(),“Field1”)!!!!但是我仍在努力解释分配器! 或者我可以使用 push_back() 而不是 insert(xxx.end()) list::insert overloads 中没有一个接受一个参数。是的,您可能需要使用list::push_back @alex :可能。这个符号似乎更容易理解! #include &lt;string&gt; 【参考方案1】:

这是一种可能更接近 Python 正常用法的方法。我们首先声明一个指向字符串列表的指针数组(预先指定类型,而不是 Python-duck 类型(尽管我们可以使用模板做到这一点)。然后我们以内存安全的方式使用这些指针(不泄漏)来创建新列表。请注意,在此特定设置中,列表的总数在编译时是固定的(并且等于 const int SIZE),并且指针数组位于堆栈上,但列表指针指向to 都是在堆上动态分配的。(你可以用 new 和 delete 来做到这一点,但更新的智能指针确实是要走的路)。

#include <list>         
#include <memory>       //for the smart pointers
#include <iostream>    

const int SIZE = 3;

int main() 
    //make an array of smart pointers to list of strings:
    std::unique_ptr<std::list<std::string>> myLists[SIZE];
    //use each smart pointer in the list to make a new list:
    for (int i = 0; i < SIZE; i++) 
        myLists[i] = std::make_unique<std::list<std::string>>();
    
    //load each new list with a single string:
    myLists[0]->push_front("Hello");
    myLists[1]->push_front("World,");
    myLists[2]->push_front("I'm C++!");
    //print the results
    for (int i = 0; i < SIZE; i++) 
        std::cout << myLists[i]->front() << " ";
    
    std::cout << std::endl;
    return 0;


现在,如果您希望能够在运行时向列表列表中添加更多列表,则必须动态分配指向列表的指针数组,而不是像本例中那样使用静态(自动)分配. (编辑:或者,您可以设置一些上限,例如 100,然后将其设为应用程序中列表的最大数量。可能想要使用 std::array 来保存该指针列表,而不是上面的普通数组,因为 std::array 会像使用 Python 一样进行边界检查)。 对于更简单的版本:

#include <list>
//remove typedefs
int main()       //notice the int!
    const int SIZE = 10;
    //make array of pointers to list of strings (on stack, fixed size)
    std::list<std::string>* myLists[SIZE];
    //use pointer to make new list on heap:
    myLists[0] = new std::list<std::string>;
    //use pointer syntax (instead of . use ->) to call list functions
    myLists[0]->push_front("Old style C++");
    //more code...
    //when finished must remember to free that memory:
    delete myLists[0];
    //and not leave a dangling pointer:
    myLists[0] = nullptr;
    return 0;

【讨论】:

以上是关于Windows Visual Studio C++ 列表列表的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Windows 桌面 (C++) 打开 Visual Studio Express 2013? [关闭]

将 C++ Win32 控制台项目类集成到 Visual Studio 2008 中的 Visual C++(Windows 窗体应用程序)项目中

如何在 Visual Studio 2017 中创建 C++ Windows 桌面应用程序?

在 Windows 上安装 OpenCV 并使用 Visual Studio C++ 构建程序

无法在 Visual Studio 中将 Visual C++ 运行时包引用添加到 Windows Phone 项目

Windows 下 Visual Studio 2012 / Intel 编译器的 C++ 双精度失败