如何获取元组的元素

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