这是 C++ 中的有效数据结构 Map<string, string, string> 吗?

Posted

技术标签:

【中文标题】这是 C++ 中的有效数据结构 Map<string, string, string> 吗?【英文标题】:Is this a valid datastructure Map<string, string, string> in C++? 【发布时间】:2011-02-08 15:10:27 【问题描述】:

我必须为每个变量存储 3 个字符串,但不知道在 C++ 中使用哪种数据结构最好。 我只能想到 Struct,但不确定它是否是最好的方法。

类似string var[100][3]的东西,第一个维度(100)应该是动态添加和删除的。

我用地图、多地图尝试了各种各样的东西。

感谢任何帮助。谢谢

【问题讨论】:

您的问题不清楚。您总是正好有 3 个,还是要“动态添加和删除”? 您能否举一个您正在存储的键/值的示例,以便更清楚地了解您需要什么? 【参考方案1】:

如果您总是在一个三元组中恰好有 3 个字符串并希望有多个三元组,则使用三个字符串定义 struct 并将其放入 std::vector

struct Triplet 
  std::string a,b,c;
;

std::vector<Triplet> data;

【讨论】:

@Ringo 您也可以使用课程,请查看我的答案。但这很漂亮! +1 你的看起来也不错,但是是什么让你觉得这比使用类更好? @Ringo 我说它很漂亮,而不是更好! ;D @Ringo @Al 不管怎样,这是一个关于Class vs Struct for data only的有趣辩论:***.com/q/431429/176769【参考方案2】:

Map&lt;string, string, string&gt; 无效。但是,您可以创建一个包含 3 个字符串的新数据结构并将其存储在一个向量中。

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

using namespace std;

class data_structure

public:
    string first;
    string second;
    string third;
;


int main()

    vector<data_structure> my_vec;

    data_structure elem1;
    elem1.first = "one";
    elem1.second = "two";
    elem1.third = "three";

    my_vec.push_back(elem1);

    data_structure elem2;
    elem2.first = "four";
    elem2.second = "five";
    elem2.third = "six";

    my_vec.push_back(elem2);

    for (int i = 0; i < my_vec.size(); i++)
    
        // print stuff
    


【讨论】:

【参考方案3】:

如果您总是需要 3 个字符串,那么 tuple 将需要更少的开销。

#include <iostream>
#include <string>
#include <tuple>

typedef std::tuple<std::string, std::string, std::string> MyTuple;

int
main(int argc, char **argv)

    MyTuple t =
        make_tuple(
                std::string("string 1"),
                std::string("string 2"),
                std::string("string 3")
                );

    std::cout
        << std::get<0>(t) << std::endl
        << std::get<1>(t) << std::endl
        << std::get<2>(t) << std::endl;

    return 0;

【讨论】:

【参考方案4】:

您可以使用类或tuple,并将元组存储在向量中

std::vector<boost::tuple<std::string, std::string, std::string> > v;
boost::tuple<std::string, std::string, std::string> t = boost::make_tuple(s1, s2, s3);
v.push_back(t)

【讨论】:

【参考方案5】:

上述建议组合的另一个:Boost Tuple(如果您已经安装了 Boost)。

【讨论】:

【参考方案6】:

Map &lt;string , vector &lt;string&gt; &gt; 将允许您将字符串向量映射到字符串键值。如果您有相同数量的字符串映射到每个键,则使用字符串数组来减少向量的内存开销。

【讨论】:

【参考方案7】:

你可以使用vector来存储N个元素

vector<string> three_strings(3);

 three_strings.push_back("one");
 three_strings.push_back("two");
 three_strings.push_back("three");

请注意tuple 是一个替代方案,但是:(1) 它是tr1 标准的一部分,因此可能无法在您的C++ 编译器/安装中使用; (2) 它存储异构数据(例如 3 个随机类型的项目,不一定是 3 个字符串),这可能是一种矫枉过正

【讨论】:

【参考方案8】:

vector&lt;vector&lt;string&gt; &gt; 怎么样?

【讨论】:

以上是关于这是 C++ 中的有效数据结构 Map<string, string, string> 吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++关联容器知识总结

std::map迭代器有效性分析

如何(有效地)以地图为值插入地图?

C++ 引用踩的坑

C++ 引用踩的坑

在 C++ unordered_map 中有效地使用 [] 运算符