我已经找到了解决c ++问题的方法,但我发现自己在写这个:
dosomething(1,"value1");
dosomething(2,"somethingelse");
dosomething(3,"notthesame");
dosomething(7,"wahetevr");
dosomething(5,"yeah");
并且它工作正常,但它相当长......并且变得越来越长。但这两组值只是编译时间。
在python中,我会在列表中创建两个值的元组,然后只是在它们上面进行预告。有没有办法创建这两个值的轻量级异构数组?我试图避免创建一个类型并抛弃它们以及试图避免使用库,因为到目前为止我已经保留了我曾经使用过的库。
我宁愿不创建两个值集的两个数组,也很容易让它们不同步。
感谢您的建议。
答案 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)