c ++编译时异构数组,python风格

时间:2013-02-17 07:59:06

标签: c++

我已经找到了解决c ++问题的方法,但我发现自己在写这个:

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

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

在python中,我会在列表中创建两个值的元组,然后只是在它们上面进行预告。有没有办法创建这两个值的轻量级异构数组?我试图避免创建一个类型并抛弃它们以及试图避免使用库,因为到目前为止我已经保留了我曾经使用过的库。

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

感谢您的建议。

4 个答案:

答案 0 :(得分:3)

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

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

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

亚历。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

核心C ++语言中没有异类或关联数组文字,如Python中的dict

存储和检索键值对是C ++中 map 的作业。 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's QMap)和Boost.Container中的各种地图以及微软的CMap等不太便携的地图中存在类似的结构。

为了效率和便携性,我会选择标准地图,除非有令人信服的理由采取替代方法。

答案 3 :(得分:0)