什么是最好的C++替代Python字典和Zip?

2024-09-27 21:29:51 发布

您现在位置:Python中文网/ 问答频道 /正文

< Python中最好的C++替代DICT(zip(值…))的方法是什么?在

我在我的课余时间辅导一个C++学生,在我的工作中遇到了一段Python代码,发现我不知道最好的答案。在

代码如下所示(我更改了变量的名称,并对其进行了一点概括,但想法相同):

(dict(zip(wordCollection, [word.strip() for word in currentLine.split(',')][1:-1])))

我用boost将剥离和拆分的单词替换为经过修剪、标记化的向量,效果很好;但是,当我试图确定翻译dict/zip组合的最佳方式时,我却陷入了困惑。在


Tags: 方法答案代码in名称forzip学生
3条回答

你真的不应该试图直接从一种语言翻译成另一种语言。在

<>在C++中,通常不编写函数来继承迭代器并生成新迭代器,而是编写输入和输出迭代器并从一个复制到另一个的函数。因此,您可以编写一个zip函数,在T上使用输入迭代器,在{}上使用输入迭代器,在{}上使用输出迭代器。在

但这样就不会把这两个调用链接在一起,因为您的zip函数不会返回任何可以有效传递给任何类型的dict函数的任何内容(比如迭代器范围)。相反,您可以创建一个dict模拟(一个unordered_map),在其中创建一个输出迭代器,并使用zip函数将对复制到其中。在

像这样:

template <I1, I2, O>
void zip(I1 it1, I1 it1end, I2 it2, I2 it2end, O o) {
    while ((it1 != it1end) && (it2 != it2end)) {
        *o++ = std::make_pair(*it1++, *it2++);
    }
}

std::unordered_map<T, U> mapping;
zip(c1.begin(), c1.end(), c2.begin(), c2.end(), std::inserter(mapping, mapping.end()));

但我不认为你真的可以用这种方式在unordered_map上使用inserter,所以你必须写一个map_inserter函数。在

如果您在本地不知道TU类型,那么您可能需要在一个从迭代器的元素类型中提取类型的函数模板中把这些都包装起来,这样您就可以auto了。(在C++ 11中,你可以^ {CD16>}它不需要函数,但表达式将是混乱的。)


如果您对zipmap_inserter有多种用途,可能值得编写它们。但否则,更好的解决方案是将其扩展为显式循环:

^{pr2}$

IMO,^ {CD1>}的最佳C++替代是^ {< CD2>},它是哈希表,对于^ {CD3>},^ ^ {CD4>}是从D4128 ranges proposal,在github.com/ericniebler/range-v3上可以访问引用实现。在

C++ 11代码:

#include <string>
#include <vector>
#include <unordered_map>
#include <range/v3/view/zip.hpp>

int main() {
    using namespace std;
    using ranges::view::zip;

    int ints[] = {1, 2, 3};
    vector<string> strings = {"a", "b"};
    unordered_map<int, string> dict(zip(ints, strings));
}
我希望将来能成为C++标准。在

一旦你有了向量,比如:

std::vector<std::string> wordCollection;
std::vector<std::string> splitWords;

然后你可以迭代:

^{pr2}$

相关问题 更多 >

    热门问题