什么是python dictionary和zip的最佳C++替代方案

what is the best C++ alternative to python dictionary and zip?

本文关键字:C++ 最佳 方案 zip python dictionary 什么      更新时间:2023-10-16

python中dict(zip(values…))的最佳C++替代方案是什么?

我正在辅导一名C++学生,目前我正处于休息时间,在工作中遇到一段Python代码,发现我不知道最好的答案。

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

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

我使用boost用一个经过修剪、标记化的向量替换了剥离和拆分的单词,效果很好;然而,当我试图决定翻译dict/zip组合的最佳方式时,我不知所措。

一旦你有了像这样的向量

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

然后你可以迭代:

std::map<std::string, std::string> dict; // or std::unordered_map
std::size_t minSize = std::min(wordCollection.size(), splitWords.size());
for (size_t i = 0; i != minSize; ++i) {
    dict.insert(std::make_pair(wordCollection[i], splitWords[i]));
}

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

在C++中,通常不会编写使用迭代器并生成新迭代器的函数;相反,您编写的函数采用输入迭代器和输出迭代器,并从一个迭代器复制到另一个。因此,您可以编写一个zip函数,它在T上使用输入迭代器,在U上使用输入迭代器,并在pair<T, U>上使用输出迭代器。

但是,您不会以这种方式将两个调用链接在一起,因为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中,你可以在不需要函数的情况下decltype,但表达式会一团糟。)


如果zipmap_inserter有多种用途,那么编写它们可能是值得的。但除此之外,更好的解决方案是将其扩展为一个显式循环:

auto it1 = c1.begin(), it1end = c1.end(), it2 = c2.begin(), it2end = c2.end();
std::unordered_map<T, U> mapping;
while ((it1 != it1end) && (it2 != it2end)) {
    mapping[*it1++] = *it2++;
}

IMO,dict的最佳C++替代方案是std::unordered_map,它是一个哈希表,而对于zip,它是D4128范围提案中的ranges::view::zip,其参考实现可以访问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++标准。

dict(zip(labels,values))  --->  dict([("a",1),("b",0)]) ---> dict(a=1,b=0)

dict只是一个哈希表。。。这只是制作一个标签和值的哈希表,其中标签(或密钥)是wordCollection,标记化的字符串是值

所以可能是一个哈希表。。。尽管在c++中可能需要多行操作