从结构数组中删除重复的字符串并对其进行计数

时间:2013-10-23 23:55:25

标签: c++ arrays struct

我正在尝试浏览由字符串和int组成的结构列表。字符串只是由网址组成的行,并且有一些网址的重复。它们按字母顺序排列,因此任何和所有重复都是紧挨着的。 int是一个计数器,用于计算某个URL的副本数量。我需要做的是只打印每个url的一个实例,以及该URL中最初有多少个url实例的计数。 我想弄清楚的是如何删除每个网址的所有实例我想知道是否有人可能知道这样做的技巧。

以下是我对此程序特定部分的代码:

 void histogram(const int MaxPages, istream& input, ostream& output)
{


    string temp;
    int current = 0;
    CountedLocation *dynamicArray = new CountedLocation[MaxPages];
    int toBeMoved = current - 1;

    getline(input, temp);

    while(!input.eof())
    {

        temp = extractTheRequest(temp);
        toBeMoved = current-1;
        dynamicArray[current].locator = temp;
        if(isAGet(temp))
        {

            temp = extractLocator(temp);
            while (toBeMoved >= 0 && temp < dynamicArray[toBeMoved].locator)
            {
                dynamicArray[toBeMoved+1].locator = dynamicArray[toBeMoved].locator;
                dynamicArray[toBeMoved+1].counter = 1;
                --toBeMoved;
            }
            dynamicArray[toBeMoved+1].locator = temp;
            dynamicArray[toBeMoved+1].counter = 1;
        }

        current++;
        getline(input, temp);

    }
    for(int i=0; i < MaxPages; i++)
    {
        string temp = dynamicArray[i].locator;
        temp = "\"" + temp + "\"";

        dynamicArray[i].locator = temp;
    }
    //int tempMax = MaxPages;
    for(int i=0; i < current; i++)
    {
        if(search(dynamicArray, MaxPages, dynamicArray[i].locator) == search(dynamicArray, MaxPages, dynamicArray[i+1].locator))
        {
            int toBeMoved = i;
            dynamicArray[i+1].counter = dynamicArray[i].counter + 1;
            while (toBeMoved < current-1)
            {
                dynamicArray[toBeMoved] = dynamicArray[toBeMoved+1];
                ++toBeMoved;
            }
            --current;
            if(search(dynamicArray, MaxPages, dynamicArray[i].locator) == search(dynamicArray, MaxPages, dynamicArray[i+1].locator))
                continue;

       }
    }

    for(int i=0; i < current+1; i++)
    {
        cerr << dynamicArray[i].locator<< ", " << dynamicArray[i].counter << endl;
        output << dynamicArray[i].locator<< ", " << dynamicArray[i].counter << endl;
    }
  delete [] dynamicArray;

}

2 个答案:

答案 0 :(得分:2)

创建新的vector结构。从流的开头开始。迭代流,如果当前字符串与vector中最后一个元素中的字符串不同,则将初始化为该字符串的元素推送到vector的后面,将计数器设置为1。否则,只需递增与最后一个vector元素关联的计数器。移动到流中的下一个字符串。假设输入字符串确实由已排序的字符串组成,那么最后,vector包含具有出现次数的唯一字符串。

在伪未经测试的代码中:

std::vector<MyStruct> love_to_count (istream &input) {
    std::string url;
    std::vector<MyStruct> v;
    if (! (input >> url)) return v;
    v.push_back(MyStruct(url, 1));
    while (input >> url) {
        if (url != v.back().url) {
            v.push_back(MyStruct(url, 1));
        } else {
            v.back().count += 1;
        }
    }
    return v;
}

答案 1 :(得分:1)

除非你迫切希望获得绝对最高速度,否则我会使用std::map

std::map<std::string, int> URLs;

读入网址和计数。使用URL作为索引,并添加计数:

URLs[URL] += count;

当你全部阅读它们时,你可以写出结果:

for (auto const &u : URLs)
    std::cout << u.first << "\t" << u.second << "\n";

虽然可以用vector代替它,但它更有效,如果你从文件中读取数据,速度的差异可能是微不足道的(处理时间会很小)噪声与I / O时间相比)