C ++空和数组索引

时间:2011-12-14 16:54:37

标签: c++

是否可以执行以下操作:

string word = "Hello";
word[3] = null;
if(word[3] == null){/.../}

在C ++中,基本上将数组元素设为空。例如,如果我想从数组中删除重复的字符,我首先将它们设置为null,然后每当我找到包含null的数组索引时将数组移到左侧。

如果这不可能,那么用C ++做这样的事情的好方法是什么?

4 个答案:

答案 0 :(得分:5)

如果要删除相邻的重复字符,可以执行以下操作:

std::string::iterator new_end = std::unique(word.begin(), word.end());
word.erase(new_end, word.end());

如果要标记要删除的任意字符,可以跳过标记,只为std::remove_if提供相应的谓词:

new_end = std::remove_if(word.begin(), word.end(), IsDuplicate);
word.erase(new_end, word.end());

但是,我无法想到在这里使用的适当谓词没有表现出未定义的行为。我只想写自己的算法:

template<typename IteratorT>
IteratorT RemoveDuplicates(IteratorT first, IteratorT last)
{
    typedef typename std::iterator_traits<IteratorT>::value_type
            ValueT;
    std::map<ValueT, int> counts;
    for (auto scan=first; scan!=last; ++scan)
    {
        ++counts[*scan];
        if(counts[*scan] == 1)
        {
            *first = std::move(*scan);
            ++first;
        }
    }
    return first;
}

或者,如果你不关心元素的顺序,你可以简单地对它进行排序,然后使用第一个解决方案。

答案 1 :(得分:0)

我认为你应该看一下STL中的算法 您对要删除的内容并不十分具体,但这可能会有所帮助:

    std::string string_with_dup("AABBCCDD");
    std::string string_without_dup;
    std::cout << string_with_dup << std::endl;
    // with copy
    std::unique_copy(string_with_dup.begin(), string_with_dup.end(), std::back_inserter(string_without_dup));
    std::cout << string_without_dup << std::endl;
    // or inplace
    string_with_dup.erase(std::unique(string_with_dup.begin(), string_with_dup.end()), string_with_dup.end());
    std::cout << string_with_dup << std::endl;

答案 2 :(得分:0)

这是可能的,因为字符串的单个元素是char数组中的元素,因此可以表示为指针,i。即您可以检索元素的地址。因此,您可以设置word[3] = null。您的if - 构造有效,但编译器会输出警告,这是因为NULL只是一个指针常量。替代方案是:if (!word[3])if(word[3] == 0)

但无论如何你应该考虑使用STL algorithms删除重复项。

答案 3 :(得分:0)

如果你想删除所有重复项(不仅是相邻的副本,你应该使用erase-remove idiom这样的

#include <iostream>
#include <map>
#include <string>
#include <algorithm>

using namespace std;

struct is_repeated {
    is_repeated( map<char,int>& x ) :r(&x) {};
    map<char,int>* r;
    bool operator()( char c ) {
        (*r)[c]++;
        if( (*r)[c] > 1 )
            return true;
        return false;
    }
};

int main (int argc, char**argv)
{
    map<char,int> counter_map;
    string v = "hello hello hello hello hello hello hello";
    cout << v << endl;
    is_repeated counter(counter_map);
    v.erase( remove_if(v.begin(), v.end(), counter ), v.end() );
    cout << v << endl;
}

输出(截至this):

hello hello hello hello hello hello hello
helo