【问题标题】:Creating a set of strings from a vector<T>从 vector<T> 创建一组字符串
【发布时间】:2018-06-24 03:52:08
【问题描述】:

我有一个 CustomClass 对象的向量 - 其中有一个名为 name 的字符串字段。如何在 C++ 中创建这些名称的 set

如果我这样做:

std::vector<CustomClass> vec ;
// .... populate with data
std::set< std::string> myset( vec.begin(), vec.end() ) ;

编译器当然会抱怨,但是我如何“应用”一个函数,以便从向量的每个元素中获取“vec.name”?

我正在使用 C++11。

【问题讨论】:

  • @nwp 分两步进行 - 首先创建一组 CustomClass,然后使用转换?
  • 这就是我会做的。或者,您可以编写一个自定义的vector_iterator_wrapper,在取消引用时返回vec_it-&gt;name,但这似乎是很多工作都没有收获。你也可以让CustomClass 隐式转换为std::string,但这很不靠谱。
  • 另一种简单的方法,就是在向量 vec 上创建一个简单的 for 循环,将每个元素插入 myset。像这样: for (const CustomClass &c : vec){myset.insert(c.name);}

标签: c++ c++11 vector lambda set


【解决方案1】:

您可以将std::transformlambda 一起使用(C++11 起),例如

std::set<std::string> myset;
std::transform(vec.begin(), 
               vec.end(), 
               std::inserter(myset, myset.end()), 
               [](const CustomClass& cc) { return cc.name; });

LIVE

【讨论】:

  • C++'98 在这里使用了一个函数。 (+1)
【解决方案2】:

一个好的旧循环(基于版本 c++11 范围)应该可以完成这项工作

for ( auto const & cc : vec )
   myset.emplace(cc.name);

【讨论】:

  • @songyuanyao - 哦!你是对的,很明显。在emplace() 中更正。谢谢!
【解决方案3】:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class demo
{
    public:
    string name;
    void input()
      {
         cout<<"\n Enter the Name:";
         cin>>name;

      }
      void output()
      {
          cout<<"\n Name is :"<<name;
      }

};
int main()
{
vector <demo> d1(3);
demo *d2;
for(int i=0;i<3;i++)
{
    d2=new demo;
    d2->input();
    d1.push_back(*d2);
}
vector<demo>::iterator j;

for( j=d1.begin();j!=d1.end();j++)
   {
      j->output();
  }

 return 0;

}

试试上面的编码,它将获取值并将其存储为包含类对象的向量。 vector d1(3) --> 为大小为 3 的类演示创建一个向量变量 d1。创建另一个指针变量 d2,通过它调用输入函数并给出值,并将类对象地址存储在向量中。 创建迭代器变量以访问存储值的值。 谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2016-03-10
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多