我自己学习C++,因此在某些 Realm 有空白页,例如。容器上的某些操作,不同操作的名称等。
因此,请帮助我解决这个问题。
(我也很高兴能向我提供足够的资源,这将帮助我选择正确的容器和方法来处理它们。真正的实现示例将有很大帮助,因为这样可以更轻松地为我获取它。)

这是我的第一个“真实”程序。我是用PHP制作的,但是现在我在学习时就重写为C++(我可以说这更具挑战性)。

简而言之,读取文件并创建3个不同的 vector ,其中包含相应的元素(人的姓名,商品的名称和商品的数量)。
因此,例如(我知道这不是分配值的方法,只是为了说明内容):

vector<string> vectorOfNames = {"Adam", "Eva", "Adam", "Adam", "Bruce"};
vector<string> vectorOfItems = {"Apple", "Apple", "Orange", "Pear", "Melon"};
vector<int> vectorOfAmount = {1, 9, 2, 4, 1};

现在,我想代表它(按人员和物品)并计数(按数量)这些 vector ,例如打印类似:
All persons:
Adam
Eva
Bruce

All items:
Apple - 10
Orange - 2
Pear - 4
Melon - 1

Adam have:
Apple - 1
Orange - 2
Pear - 4

Eva have:
Apple - 9

Bruce have:
Melon - 1

在PHP中,我使用* array_keys(array_flip())*获得唯一的名称和项目。
在C++中,我发现了以下内容:
vector< string >::iterator r , w ;

set< string > tmpset ;

for( r = vectorOfNames.begin() , w = vectorOfNames.begin() ; r != vectorOfNames.end() ; ++r )
{
    if( tmpset.insert( *r ).second )
    {
        *w++ = *r ;
    }
}

vectorOfNames.erase( w , vectorOfNames.end() );

它运作良好,但问题是它修改了原始的vectorOfNames。
我应该在应用此 vector 之前将其复制到新的 vector 上,还是有另一种方法?

至于PHP中所需的其余处理,我使用了foreach和if语句。
我正在尝试使用C++的不同方法,但是没有任何效果。我完全迷路了...
我也知道Boost库中有一些函数,但是暂时我不想去那里,宁愿先学习基础知识。

另一方面,也许我应该使用其他容器(例如 map 或其他容器)来简化此过程?

因此,如果您仍然了解我的意思,并且您没有入睡,请向正确的方向推我;)

最佳答案

第一步,即在std::vector<std::string>中获取所有唯一名称,我可能会这样:

std::vector<std::string> tmp(original);
std::sort(tmp.begin(), tmp.end());
std::unique_copy(tmp.begin(), tmp.end(),
                 std::ostream_iterator<std::string>(std::cout, "\n"));

另一种解决方案可以使用辅助std::set<std::string>,但不会按排序顺序打印名称:
std::set<std::string> mark;
std::copy_if(original.begin(), original.end(),
             [&](std::string const& value) { return mark.insert(value); });

(利用C++ 2011功能)

其他操作无法直接轻松映射到C++算法的工作方式。为了处理这些问题,我可能会使用不同的数据布局,例如,将数据存储在std::vector<std::tuple<std::string, std::string, int> >中而不是三个单独的 vector 中。

关于c++ - 如何处理 vector 以获得所需的输出?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12696359/

10-14 16:44
查看更多