我是自学C++的,所以有些地方有些空白,例如。对容器的一些操作,不同操作的名称等。 因此,请帮我解决这个问题。 (我也很感激将我送到好的资源,这将帮助我选择正确的容器和方法来处理它们。真正的实现示例将有很大帮助,因为通过这种方式对我来说更容易获得它。)
这是我的第一个“真正的”程序。我用 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 Library里面有一些函数,但是我暂时不想去那里,还是先学基础吧。
另一方面,也许我应该使用其他容器,如 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> >
中。而不是三个独立的载体。
关于c++ - 如何处理 vector 以获得所需的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12696359/