14

你能告诉我 C++ 中最接近 python 列表的数据类型是什么吗?如果没有类似的东西,你将如何用 C++ 构建它?

4

5 回答 5

13

std::vectors、std::lists 和数组(或std::arrays)都具有类似于 Python 列表的功能。您要选择哪种数据结构取决于您的要求。

于 2013-07-08T14:09:24.213 回答
7

也许将 boost::any 存储在 std::vector 中? http://www.boost.org/doc/libs/1_54_0/doc/html/boost/any.html

这是一个简单的工作示例。请参阅下面的詹姆斯评论。

#include "../boost_1_54_0/boost/any.hpp"
#include <vector>
#include <string>
#include <iostream>

int main()
{
    std::vector<boost::any> myList;

    myList.push_back(std::string("Hello"));
    myList.push_back(10);
    myList.push_back(std::string("World"));

    std::string any1 = boost::any_cast<std::string> (myList[0]);
    int any2 = boost::any_cast<int> (myList[1]);
    std::string any3 = boost::any_cast<std::string> (myList[2]);

    std::cout<<any1<<" "<<any2<<" "<<any3<<std::endl;

    return 0;
}
于 2013-07-08T14:08:11.027 回答
5

实际上没有 C++ 容器等同于 Python 的列表,这部分是由于 C++ 和 Python 的对象模型非常不同的结果。特别是,建议和赞成的 std::list 恕我直言,甚至不接近 Python 的列表类型,我宁愿建议 std::vector 或者 std::deque。也就是说,尚不清楚您到底想要什么以及如何“构建它”在很大程度上取决于“它”到底是什么,即您对容器的期望。

我建议您看一下 C++ 容器 std::vector、std::deque 和 std::list 以获得概览。然后看看像 Boost.Any 和 Boost.Variant 之类的东西,你可以将它们结合起来,也许还有智能指针和 Boost.Optional 之一。最后,查看 Boost.Container 和 Boost.Intrusive。如果这些不太可能提供合适的近似值,您需要更好地解释您的实际目标是什么。

于 2013-07-08T14:26:13.440 回答
2

没有真正的等价物,而且很难提供一个。Python 和 C++ 是完全不同的语言,在 C++ 的上下文中提供一种语言真的没有多大意义。最重要的区别是 Python 中的所有内容都是动态分配的,并且是一个“对象”,并且 Python 使用鸭子类型。

FWIW:一个非常早期的 C++ 库(在模板之前)确实提供了 的容器Object*,以及 box 的派生类intdouble。实际经验很快表明这不是一个好主意。(而且我很好奇:其他人还记得吗?特别是,它到底叫什么——里面有 NHS 的东西,但我不记得更多了。)

于 2013-07-08T14:30:29.547 回答
2

我正在研究 std::vector 的包装器,使其更像 Python 的名为pylistpp的列表。API 就像 Python 一样。例子:

#include <list.hpp>
#include <iostream>

int main()
{
    list<int> mylist;
    mylist.append(5);
    mylist.append(7);
    int count = mylist.count(5);
    std::cout << count << std::endl;
    std::cout << mylist.pop(0) << std::endl;
    std::cout << mylist.index(7);
    return 0;
}
于 2013-07-08T22:59:17.410 回答