作为C++中的地图键

作为C++中的地图键,c++,C++,好的,我想知道如何从一个两个单词的字符串创建一个映射键。例如,这只是一个测试。将包含bigrams这是,只是,只是一个,和一个测试 我正在考虑使用make_pair,但有些事情告诉我,这可能会导致这些bigram的创建顺序混乱。会是这样吗?如果不是,这种配对方法是否正确?我建议使用std::pair,因为它本身就是二进制的。如果您可能需要三角形或4-gram,您可能希望使用std::tuple,这是非正式地说的std::pair的泛化 只要你的二元数算法是正确的,顺序就会被保留。可以做出一些明显

好的,我想知道如何从一个两个单词的字符串创建一个映射键。例如,这只是一个测试。将包含bigrams这是,只是,只是一个,和一个测试

我正在考虑使用make_pair,但有些事情告诉我,这可能会导致这些bigram的创建顺序混乱。会是这样吗?如果不是,这种配对方法是否正确?

我建议使用std::pair,因为它本身就是二进制的。如果您可能需要三角形或4-gram,您可能希望使用std::tuple,这是非正式地说的std::pair的泛化

只要你的二元数算法是正确的,顺序就会被保留。可以做出一些明显的改进,但我在这里写了一个快速实现:

#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <map>
#include <sstream>
#include <utility>

std::vector<std::string> tokenize(const std::string& s) {
    std::istringstream iss(s);

    std::vector<std::string> v{std::istream_iterator<std::string>(iss),
                               std::istream_iterator<std::string>()};
    return v;
}

std::vector<std::pair<std::string, std::string>> make_bigrams(const std::vector<std::string>& tokens) {
    std::vector<std::pair<std::string, std::string>> bigrams;
    for(auto it = std::cbegin(tokens); it != std::prev(std::cend(tokens)); ++it) {
        bigrams.push_back(std::make_pair(*it, *std::next(it)));
    }
    return bigrams;
}

std::vector<std::pair<std::string, std::string>> sentence_bigram(const std::string& s) {
    const auto toks = tokenize(s);
    return make_bigrams(toks);
}

int main() {
    const auto& bigrams = sentence_bigram("hello, world. my name is erip");
    std::map<std::pair<std::string, std::string>, int> m;
    for(const auto& e: bigrams) {
       std::cout << "Adding (" << e.first << "), (" << e.second << ") to the map.\n";
       m[e] = 0;
    }
} 

您可以看到它的实际作用。

您可以使用几乎任何数据结构来存储二进制内存。std::vector、std::tuple/std::pair、std::list等都是有效和合理的选择,这取决于您想对它们做什么。感谢您的帮助!谢谢你的帮助!