这是 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<string, string, string>
无效。但是,您可以创建一个包含 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 <string , vector <string> >
将允许您将字符串向量映射到字符串键值。如果您有相同数量的字符串映射到每个键,则使用字符串数组来减少向量的内存开销。
【讨论】:
【参考方案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<vector<string> >
怎么样?
【讨论】:
以上是关于这是 C++ 中的有效数据结构 Map<string, string, string> 吗?的主要内容,如果未能解决你的问题,请参考以下文章