1

我有一个 C++ 问题的解决方案,但我发现自己在写这个:

dosomething(1,"value1");
dosomething(2,"somethingelse");
dosomething(3,"notthesame");
dosomething(7,"wahetevr");
dosomething(5,"yeah");

它工作正常,但它相当长......而且越来越长。但是这两组值只是编译时间。

在 python 中,我会在列表中创建两个值的元组,然后对它们进行遍历。有没有办法创建两个值的轻量级异构数组?我试图避免创建一个类型并将它们投入其中,并试图避免使用库,因为到目前为止我已经将我使用过的库保持为零。

我宁愿不创建两个值集的两个数组,让它们不同步太容易了。

感谢您的建议。

4

4 回答 4

3

这取决于你的编译器。如果你有一个现代编译器,你可以使用 C++ 11tuple类型。例如:

std::vector<std::tuple<int, std::string>> tuples = 
    { 
        std::make_tuple(1, "value1"), 
        std::make_tuple(2, "somethingelse"), 
        ... 
    };

for(auto item : tuples)
    dosomething(get<0>(item), get<1>(item));

如果您的编译器不支持元组或基于范围的 for,您可以使用 boost 元组和 BOOST_FOREACH。他们有一个类似的界面,只是谷歌它:)

亚历克斯。

于 2013-02-17T08:05:23.067 回答
1

这就是std::map的用途。它本质上是一个关联数组。

于 2013-02-17T08:07:04.427 回答
1

核心 C++ 语言中没有异构或关联数组文字,如dictPython 中的 s

存储和检索键值对是C++ 中映射的一项工作。std::map是标准库的一部分,包含在每个符合标准的编译器中,不容忽视!

#include <iostream>
#include <map>
#include <string>

int main()
{   
    // Typedefs make code more readable:
    typedef std::map<int, std::string> lookup_t;

    // Create map:
    lookup_t lookup;

    // Insert information:
    lookup[1] = "value1";
    lookup[2] = "somethingelse";
    lookup[3] = "notthesame";
    lookup[7] = "wahetevr";
    lookup[5] = "yeah";

    // Random access:
    std::cout << "3 -> " << lookup[3] << std::endl;

    // Sequential access:
    for (lookup_t::iterator i = lookup.begin(), end = lookup.end(); i != end; ++i)
    {   
        std::cout << i->first // key
            << " -> "
            << i->second // value
            << std::endl;
    }
}

类似的结构存在于其他第三方库中,例如Qt和QMapBoost.Container中的各种映射,以及诸如 Microsoft 的移植性较差的库中CMap

出于效率和可移植性的考虑,我会选择标准地图,除非有令人信服的理由采取替代方法。

于 2013-02-17T08:26:47.897 回答
0

只使用boost元组库

这是文档: http: //www.boost.org/doc/libs/1_37_0/libs/tuple/doc/tuple_users_guide.html

编辑:

你也有http://www.cplusplus.com/reference/tuple/tuple/

于 2013-02-17T08:01:28.717 回答