什么是python dictionary和zip的最佳C++替代方案
what is the best C++ alternative to python dictionary and zip?
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
函数。
如果你不知道T
和U
的本地类型,你可能想把它们封装在一个函数模板中,该模板从迭代器的元素类型中提取类型,这样你就可以auto
了。(在C++11中,你可以在不需要函数的情况下decltype
,但表达式会一团糟。)
如果zip
和map_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++中可能需要多行操作
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- 派生类销毁的最佳实践是什么
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 检测win32服务创建和删除的最佳方法
- 在reactor中存储eventHandlers的最佳方式是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在AVX通道中混洗的最佳方式
- 程序顶部的声明与定义(最佳实践)
- 别名模板的专业化 C++11 中没有开销的最佳替代方案