2024-09-27 21:29:51 发布
网友
代码如下所示(我更改了变量的名称,并对其进行了一点概括,但想法相同):
(dict(zip(wordCollection, [word.strip() for word in currentLine.split(',')][1:-1])))
我用boost将剥离和拆分的单词替换为经过修剪、标记化的向量,效果很好;但是,当我试图确定翻译dict/zip组合的最佳方式时,我却陷入了困惑。在
你真的不应该试图直接从一种语言翻译成另一种语言。在
zip
T
但这样就不会把这两个调用链接在一起,因为您的zip函数不会返回任何可以有效传递给任何类型的dict函数的任何内容(比如迭代器范围)。相反,您可以创建一个dict模拟(一个unordered_map),在其中创建一个输出迭代器,并使用zip函数将对复制到其中。在
dict
unordered_map
像这样:
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函数。在
inserter
map_inserter
如果您在本地不知道T和U类型,那么您可能需要在一个从迭代器的元素类型中提取类型的函数模板中把这些都包装起来,这样您就可以auto了。(在C++ 11中,你可以^ {CD16>}它不需要函数,但表达式将是混乱的。)
U
auto
如果您对zip和map_inserter有多种用途,可能值得编写它们。但否则,更好的解决方案是将其扩展为显式循环:
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)); }
一旦你有了向量,比如:
std::vector<std::string> wordCollection; std::vector<std::string> splitWords;
然后你可以迭代:
你真的不应该试图直接从一种语言翻译成另一种语言。在
<>在C++中,通常不编写函数来继承迭代器并生成新迭代器,而是编写输入和输出迭代器并从一个复制到另一个的函数。因此,您可以编写一个zip
函数,在T
上使用输入迭代器,在{但这样就不会把这两个调用链接在一起,因为您的
zip
函数不会返回任何可以有效传递给任何类型的dict
函数的任何内容(比如迭代器范围)。相反,您可以创建一个dict
模拟(一个unordered_map
),在其中创建一个输出迭代器,并使用zip
函数将对复制到其中。在像这样:
但我不认为你真的可以用这种方式在
unordered_map
上使用inserter
,所以你必须写一个map_inserter
函数。在如果您在本地不知道
T
和U
类型,那么您可能需要在一个从迭代器的元素类型中提取类型的函数模板中把这些都包装起来,这样您就可以auto
了。(在C++ 11中,你可以^ {CD16>}它不需要函数,但表达式将是混乱的。)如果您对
^{pr2}$zip
和map_inserter
有多种用途,可能值得编写它们。但否则,更好的解决方案是将其扩展为显式循环:IMO,^ {CD1>}的最佳C++替代是^ {< CD2>},它是哈希表,对于^ {CD3>},^ ^ {CD4>}是从D4128 ranges proposal,在github.com/ericniebler/range-v3上可以访问引用实现。在
C++ 11代码:
我希望将来能成为C++标准。在一旦你有了向量,比如:
然后你可以迭代:
^{pr2}$相关问题 更多 >
编程相关推荐