这段代码的作用是给定一个字符串,它将查看底部附加的数组,这样如果一个字符串与一个数组元素匹配,则字符串的所有新位组合在一起形成一个新的字符串,然后它会被退回!换句话说,它通过在“字典”中查找然后返回解释的新strnig来转换长字符串和原始字符串。
我试图在//注释中添加一些代码,这样如果我遇到与记录中的任何内容不匹配的原始字符串,就像在数组中一样,那么它将调用另一个函数来处理它。我正在考虑记录它,以便我可以更新字典。
谢谢!
string string_look_up(string data)
{
string loc_string = "";
std::stringstream ss(data);
std::string line;
while (std::getline(ss, line, '0'))
{
if (line.empty())
{
continue;
}
cout << line << endl;
for (int i = 0; i < 82; i++)
{
if (line == dictionary_array_strings_raw[i])
{
loc_string = loc_string + dictionary_array_strings_digits[i];
}
}
/// this is where the new code I want should be
cout << loc_string << endl;
cout << "######" << endl;
}
return loc_string;
}
const string dictionary_array_strings_raw[] = { // x
"25643663",
// Y
"2346442", "2446442",
// Z
"3676764",
// :
"4",
// -
"111" }
const string dictionary_array_strings_digits[] = { // x
"X",
// Y
"Y", "Y",
// Z
"Z",
// :
":",
// -
"-",
// 1 }
答案 0 :(得分:0)
您可以使用std::find
在数组中找到原始字符串。要获取digits数组的索引,只需从std :: find返回的迭代器中减去数组的开头。
std :: find需要搜索范围的两个迭代器(开始和结束)。普通指针可以用作迭代器(因为它们支持递增(++)和解除引用(*))。返回值是指向找到的第一个元素的interator或指向结尾的end-iterator(一个超过最后一个元素)。
std :: function参数允许您为原始字符串数组中找不到的行指定回调。您可以使用与签名(const std::string&
参数和std::string
返回值)匹配的任何函数或lambda。
警告:以下代码不正确。它使用82作为字典条目的数量(如原始帖子中的代码),但它只定义了6个字典条目。如果使用未知的原始字符串,这将导致未定义的行为。您应该添加76个字典条目或将输入计数从82减少到6。
#include <string>
#include <map>
#include <sstream>
#include <algorithm>
#include <functional>
#include <iostream>
#include <cassert>
using namespace std;
const string dictionary_array_strings_raw[] = { // x
"25643663",
// Y
"2346442", "2446442",
// Z
"3676764",
// :
"4",
// -
"111"
};
const string dictionary_array_strings_digits[] = { // x
"X",
// Y
"Y", "Y",
// Z
"Z",
// :
":",
// -
"-",
// 1
};
string string_look_up(string data, std::function<std::string(const std::string&)> callback)
{
assert(callback != nullptr);
const auto dictionary_array_strings_raw_end = dictionary_array_strings_raw + 82;
std::string loc_string = "";
std::stringstream ss(data);
std::string line;
while (std::getline(ss, line, '0'))
{
if (line.empty())
{
continue;
}
cout << line << endl;
const auto it = std::find(dictionary_array_strings_raw, dictionary_array_strings_raw_end, line);
if (it == dictionary_array_strings_raw_end)
loc_string += callback(line);
else
loc_string += dictionary_array_strings_digits[it - dictionary_array_strings_raw];
cout << loc_string << endl;
cout << "######" << endl;
}
return loc_string;
}
以下示例显示了lambda用于未知原始字符串(示例中为“99”)。
int main(int argc, char **argv)
{
const auto result = string_look_up("25643663023464420990", [](const std::string& line) { return '<' + line + '>'; });
std::cout << "Result:\n" << result;
return 0;
}
当string_look_up遇到包含'99'的行时,它会尝试查找匹配的原始字符串。当它找不到匹配的原始字符串时,它调用回调函数,其中“99”作为唯一参数。在main中定义的lambda添加'&lt;'之前和'&gt;'在行值之后并将结果返回给string_look_up(),后者将返回值添加到结果中。
输入25643663023464420990
导致输出XY<99>
(以及大量调试输出)
我建议使用std :: map作为转换表(原始字符串作为键,数字作为值)。使用map可以使用find()成员函数来获取迭代器(让我们称之为'it')和it-&gt; second来获取数字字符串。
以下是地图静态初始化的示例:
const std::map<std::string, std::string> translationTable = {
{"25643663", "X"},
{"2346442", "Y"},
{"2446442", "Y" }
// ...
};
您可以搜索const auto it = translationTable.find(line);
的值,并将其与translationTable.end()
进行比较,以检查搜索是否成功。 it->first
包含原始字符串(即“25643663”),而it->second
包含数字字符串(即“X”)
答案 1 :(得分:-1)
为循环设置bool标志。如果找到匹配项,请将其设置为true。然后,您可以检查评论的位置。
if(flag)
{
//code if found
}
else
{
//code if not found
}