我需要读入10,000个整数的列表,并按升序将它们放在向量中。请注意,我不是在阅读然后排序,而是在阅读时对进行排序。
我这样做是为了学习练习。我意识到读取时的排序是O(n ^ 2),而读取然后排序可以是O(n +(n log(n)),快速排序或类似。
我在C数组中完成了这个,但是我在使用向量时遇到了麻烦。关于如何做到这一点的任何建议?
提前致谢!
编辑: C数组代码:
为了充分解释,我有两节课。 ArrayIntStorage和VectorIntStorage。
重点是这是一次学习练习。
这些类中的每一个都有一个_data成员变量,一个是int [],一个是向量 每个类都有一个读写方法,这是ArrayIntStorage的读取方法
void ArrayIntStorage::read(istream &sin)
{
string x;
sin >> x >> _numberOfInts;
_data = new int[_numberOfInts];
if(_sortRead)
{
int i, j, index;
sin >> _data[0];
for(i = 1; i < _numberOfInts; i++)
{
sin >> index;
j = i;
while((j > 0) && (_data[j-1] > index))
{
_data[j] = _data[j - 1];
--j;
}
_data[j] = index;
}
}
else
{
for(int i = 0; i < _numberOfInts; ++i)
{
sin >> _data[i];
}
}
}
答案 0 :(得分:5)
示例时间:
std::vector<int> target;
// reading
std::ifstream file("integers.txt");
int number;
while (file >> number)
{
target.insert(std::lower_bound(target.begin(), target.end(), number), number);
}
答案 1 :(得分:1)
我没有编译它,但也可以使用优先级队列
#include <queue>
#include <iostream>
priority_queue<int> pq;
// reading
std::ifstream file("integers.txt");
string line;
while (getline(file, line))
{
int number = boost::lexical_cast<int>(line);
pq.push (number);
}
根据this question push()是O(log(N)),pop是O(2 * log(N))
答案 2 :(得分:1)
我会使用multiset
为我做排序:
void VectorIntStorage::read(istream &sin) {
multiset<int> ms;
copy(istream_iterator<int>(sin), istream_iterator<int>(),
inserter(ms, ms.end()));
vector<int>(ms.begin(), ms.end()).swap(_data);
}