C++ C栋和x2B栋+;翻译与给定的字典?

C++ C栋和x2B栋+;翻译与给定的字典?,c++,string,word,C++,String,Word,我试图建立一个简单的翻译器,根据给定的词典翻译句子。假设我们有两个字符串 string ENG[] = {"black","coffee", "want","yesterday"}; string SPA[] = {"negro", "café", "quiero", ayer"}; 如果用户给出“我想要一杯黑咖啡”,结果应该是“I?quiro a?negro cafe”。这意味着对于字典字符串中没有翻译的单词,旁边应该有问号 #include <iostream> using n

我试图建立一个简单的翻译器,根据给定的词典翻译句子。假设我们有两个字符串

string ENG[] = {"black","coffee", "want","yesterday"};
string SPA[] = {"negro", "café", "quiero", ayer"};
如果用户给出“我想要一杯黑咖啡”,结果应该是“I?quiro a?negro cafe”。这意味着对于字典字符串中没有翻译的单词,旁边应该有问号

#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {

  string input string ENG[] = {"black", "coffee", "want", "yesterday"};
  string SPA[] = {"negro", "café", "quiero", "ayer"};

  cout << "Enter a word";
  cin >> input;

  for (int i = 0; i < 10; ++i) {
    if (ENG[i] == input) {
      cout << "You entered " << SPA[i] << endl;
    }
  }
  return 0;
}
#包括
使用名称空间std;
int main(int argc,char*argv[]){
字符串输入字符串ENG[]={“黑”、“咖啡”、“想要”、“昨天”};
字符串SPA[]={“negro”、“café”、“quiero”、“ayer”};
cout>输入;
对于(int i=0;i<10;++i){
如果(ENG[i]==输入){
给你

#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector <string> split_sentence(const string& arg)
{

    vector <string> ret;

    auto it = arg.begin();
    while (it != arg.end()) {

        string tmp;

        while (it != arg.end() && *it == ' ') ++it;
        while (it != arg.end() && *it != ' ')
            tmp += *it++;

        if (tmp.size())
            ret.push_back(tmp);
    }

    return ret;
}

int main(int argc, char *argv[])
{
    string input = "I want a black     coffee .";

    string ENG[4] = {"black","coffee", "want","yesterday"};
    string SPA[4] = {"negro", "café", "quiero", "ayer"};

    cout << "Enter sentence\n";
    /*
        cin >> input;
    */

    for (auto& str: split_sentence(input)) {

        bool found = false;

        for (int j=0; j<4 && !found; ++j) {

            if (ENG[j] == str) {
                cout << SPA[j] << " ";
                found = true;
            }
        }

        if (!found)
            cout << str << "? ";
    }

    cout << endl;
}
将句子按空格分开,然后从dict中找到合适的单词。 如果您的dict足够大,您需要使用一些树状数据结构来提高速度或排序和散列

编辑:


正如注释中所建议的,对于这两个分离的数组,使用起来非常繁琐,难以更新。想象在中间插入一个新的值对,并用偏移量……< /P> 因此,这里更好的解决方案是使用

std::map
,特别是考虑到这应该是一个简单的1:1映射

因此,您可以使用
std::string
作为键(原始单词)和a
std::string
作为值(翻译)来定义
std::map

使用现代C++时,初始化可以是这样的:

std::map<std::string, std::string> translations {
    {"black", "negro"},
    {"coffee", "café"},
    // ...
};
查找实际翻译也变得微不足道。在后台(在
std::map
类中)迭代所有翻译:


您的代码中似乎缺少很多字符。您能仔细检查一下您是否已正确复制了所有内容吗?我如何编辑此代码--使用文本编辑器。或者您的意思是“编写程序来完成此操作”?两个“并行数组”“像你正在使用的那样”并不是存储数据的好方法。你不仅需要在所有项目中循环查找一个单词,而且很难维护(插入一个错误的单词,之后的所有内容都将是错误的)。查看
无序映射
(C++11及以上)或
映射
(早期版本)。关于这一点,下面的文章可能很有意思:。翻译句子比用字典逐字替换要多一些。虽然有一些令人印象深刻的结果,但如果你用复杂的输入证明谷歌翻译之类的东西,那么输出就会变得有趣。(尽管几乎每个人都担心人工智能会取代他/她的工作,但我仍然在嘲笑它……)我假设你只是想简单地替换句子中的单词,而不是用语法之类的东西编写一个实际的翻译程序。你应该把问题分解成几个小部分。首先尝试找出如何在句子中分隔单词。然后翻译每个单词,依此类推。
Trie will be faster for this. For each query you 
can get the appropriate word in O(m), m = length of
query(English word)
std::map<std::string, std::string> translations {
    {"black", "negro"},
    {"coffee", "café"},
    // ...
};
std::istringstream stream(myInputText);
std::string word;

while (stream >> word) {
    // do something with each word
}
const auto &res = translations.find(word);

if (res == translations.end()) // nothing found
    std::cout << "? ";
else
    std::cout << res->second << " "; // `res->second` is the value, `res->first` would be the key, i.e. `word`
#include <iostream>
#include <string>
#include <sstream>
#include <map>

int main(int argc, char **argv) {
    std::map<std::string, std::string> translations {
        {"black", "negro"},
        {"coffee", "café"}
    };

    std::string source("I'd like some black coffee");
    std::istringstream stream(source);
    std::string word;

    while (stream >> word) {
        const auto &t = translations.find(word);

        if (t != translations.end()) // found
            std::cout << word << ": " << t->second << "\n";
        else
            std::cout << word << ": ???\n";
        }

        return 0;
    }
I'd: ???
like: ???
some: ???
black: negro
coffee: café