如何获取元组的元素
How to get the elements of a tuple
我正在创建一个拼字游戏,我需要对字典中的单词进行基本评分。
我使用了 make_tuple 并将其存储在我的元组中。有没有办法像访问向量一样访问元组中的元素?
#include <iostream>
#include <tuple>
#include <string>
#include <fstream>
void parseTextFile()
{
std::ifstream words_file("scrabble_words.txt"); //File containing the words in the dictionary (english) with words that do not exist
std::ofstream new_words_file("test.txt"); //File where only existing words will be saved
std::string word_input;
std::tuple<std::string, int> tupleList;
unsigned int check_integrity;
int counter = 0;
while(words_file >> word_input)
{
check_integrity = 0;
for (unsigned int i = 0; i < word_input.length(); i++)
{
if((int)word_input[i] >= 97 && (int)word_input[i] <= 123) //if the letter of the word belongs to the alphabet
{
check_integrity++;
}
}
if(word_input.length() == check_integrity)
{
new_words_file << word_input << std::endl; //add the word to the new file
tupleList = std::make_tuple(word_input, getScore(word_input)); //make tuple with the basic score and the word
counter++; //to check if the amount of words in the new file are correct
std::cout << std::get<0>(tupleList) << ": " << std::get<1>(tupleList) << std::endl;
}
}
std::cout << counter << std::endl;
}
一个人通常会使用 tuple when there are more than two values of different types to store. For just two values a pair 是更好的选择。
在你的情况下,你想要实现的似乎是一个词值对列表。您可以将它们存储在容器中,例如向量,但您也可以将它们作为键值对存储在 map 中。正如您在遵循 link 时看到的那样,std::map
实际上是 std::pair
对象的集合,元组是对的概括。
为了完整起见,如果我对您的代码用途的理解是正确的,那么这些是对您的代码的补充,用于将每个元组存储在一个向量中 - 声明,
std::tuple<std::string, int> correct_word = {};
std::vector<std::tuple<std::string, int>> existing_words = {};
更改保存现有单词的循环 - 此处您要将每个单词值元组添加到向量中,
if(word_input.length() == check_integrity)
{
// ...
correct_word = std::make_tuple(word_input, getScore(word_input));
existing_words.push_back(correct_word);
// ...
}
..最后是构造循环外的用法示例:
for (size_t iv=0; iv<existing_words.size(); ++iv)
{
correct_word = existing_words[iv];
std::cout << std::get<0>(correct_word) << ": " << std::get<1>(correct_word) << std::endl;
}
std::cout << counter << std::endl;
带有地图的相同代码如下所示:
唯一的声明是从字符串到值的映射(而不是元组和元组向量),
std::map<std::string, int> existing_words = {};
在构建循环中,您将像这样在一行中创建地图对,
if(word_input.length() == check_integrity)
{
// ...
existing_words[word_input] = getScore(word_input);
// ...
}
虽然在构建之后,您将使用 .first
作为单词并使用 .second
作为计数器来访问地图元素。下面是一个同样使用 for 自动循环的打印示例:
for (const auto& correct_word : existing_words)
std::cout << correct_word.first << ": " << correct_word.second << std::endl;
std::cout << counter << std::endl;
请注意地图默认按字母顺序排列,您可以提供自己的排序规则,如果您不想要任何 ordering/sorting.
,也可以使用 unordered map
我正在创建一个拼字游戏,我需要对字典中的单词进行基本评分。
我使用了 make_tuple 并将其存储在我的元组中。有没有办法像访问向量一样访问元组中的元素?
#include <iostream>
#include <tuple>
#include <string>
#include <fstream>
void parseTextFile()
{
std::ifstream words_file("scrabble_words.txt"); //File containing the words in the dictionary (english) with words that do not exist
std::ofstream new_words_file("test.txt"); //File where only existing words will be saved
std::string word_input;
std::tuple<std::string, int> tupleList;
unsigned int check_integrity;
int counter = 0;
while(words_file >> word_input)
{
check_integrity = 0;
for (unsigned int i = 0; i < word_input.length(); i++)
{
if((int)word_input[i] >= 97 && (int)word_input[i] <= 123) //if the letter of the word belongs to the alphabet
{
check_integrity++;
}
}
if(word_input.length() == check_integrity)
{
new_words_file << word_input << std::endl; //add the word to the new file
tupleList = std::make_tuple(word_input, getScore(word_input)); //make tuple with the basic score and the word
counter++; //to check if the amount of words in the new file are correct
std::cout << std::get<0>(tupleList) << ": " << std::get<1>(tupleList) << std::endl;
}
}
std::cout << counter << std::endl;
}
一个人通常会使用 tuple when there are more than two values of different types to store. For just two values a pair 是更好的选择。
在你的情况下,你想要实现的似乎是一个词值对列表。您可以将它们存储在容器中,例如向量,但您也可以将它们作为键值对存储在 map 中。正如您在遵循 link 时看到的那样,std::map
实际上是 std::pair
对象的集合,元组是对的概括。
为了完整起见,如果我对您的代码用途的理解是正确的,那么这些是对您的代码的补充,用于将每个元组存储在一个向量中 - 声明,
std::tuple<std::string, int> correct_word = {};
std::vector<std::tuple<std::string, int>> existing_words = {};
更改保存现有单词的循环 - 此处您要将每个单词值元组添加到向量中,
if(word_input.length() == check_integrity)
{
// ...
correct_word = std::make_tuple(word_input, getScore(word_input));
existing_words.push_back(correct_word);
// ...
}
..最后是构造循环外的用法示例:
for (size_t iv=0; iv<existing_words.size(); ++iv)
{
correct_word = existing_words[iv];
std::cout << std::get<0>(correct_word) << ": " << std::get<1>(correct_word) << std::endl;
}
std::cout << counter << std::endl;
带有地图的相同代码如下所示:
唯一的声明是从字符串到值的映射(而不是元组和元组向量),
std::map<std::string, int> existing_words = {};
在构建循环中,您将像这样在一行中创建地图对,
if(word_input.length() == check_integrity)
{
// ...
existing_words[word_input] = getScore(word_input);
// ...
}
虽然在构建之后,您将使用 .first
作为单词并使用 .second
作为计数器来访问地图元素。下面是一个同样使用 for 自动循环的打印示例:
for (const auto& correct_word : existing_words)
std::cout << correct_word.first << ": " << correct_word.second << std::endl;
std::cout << counter << std::endl;
请注意地图默认按字母顺序排列,您可以提供自己的排序规则,如果您不想要任何 ordering/sorting.
,也可以使用 unordered map