相关疑难解决方法(0)

如何使向量元素独特?(删除不相邻的重复项)

我有一个包含很少非相邻重复项的向量.

举个简单的例子,考虑一下:

2 1 6 1 4 6 2 1 1
Run Code Online (Sandbox Code Playgroud)

我试图vector通过删除不相邻的重复项并保持元素的顺序来使这个独特.

结果将是:

2 1 6 4 
Run Code Online (Sandbox Code Playgroud)

我尝试的解决方案是:

  1. 插入std :: set但这种方法的问题是它会扰乱元素的顺序.
  2. 使用std :: sort和std :: unique的组合.但同样的订单问题.
  3. 手动重复消除:

        Define a temporary vector TempVector.
        for (each element in a vector)
        {
            if (the element does not exists in TempVector)
            {
                add to TempVector;
            }
        }
        swap orginial vector with TempVector.
    
    Run Code Online (Sandbox Code Playgroud)

我的问题是:

是否有任何STL算法可以从向量中删除不相邻的重复项?它的复杂性是什么?

c++ stl vector unique

34
推荐指数
4
解决办法
4万
查看次数

将指针与不同数组进行比较以获得相等性是否是未指定的行为?

等于运算符对指针的关系运算符有语义限制:

==(等于)和!=(不等于)运算符具有与关系运算符相同的语义限制,转换和结果类型,除了它们的优先级和真值结果.[C++03§5.10p2]

关系运算符对比较指针有限制:

如果同一类型的两个指针p和q指向不是同一个对象的成员或同一个数组的元素或不同函数的不同对象,或者只有其中一个为null,则p <q,p的结果> q,p <= q,p> = q未指定.[§5.9p2]

这是一个由等式运算符"继承"的语义限制吗?

具体来说,给出:

int a[42];
int b[42];
Run Code Online (Sandbox Code Playgroud)

很明显,(a + 3)<(b + 3)是未指定的,但是(a + 3)==(b + 3)也未指定?

c++ standards pointers unspecified-behavior

16
推荐指数
3
解决办法
2565
查看次数

从列表<int>中删除重复项

使用STL算法(尽可能多),例如remove_if()list::erase,有一种很好的方法可以从定义如下的列表中删除重复项:

list<int> l;

请注意,list::unique()仅当连续元素中出现重复时才有效.就我而言,无论在列表中的位置如何,都必须删除所有重复项.此外,删除重复意味着在最终结果中仅保留每个元素的一个副本.

编辑:l.sort()后面的选项l.unique()无法使用,因为这将破坏列表的顺序.

c++ stl

6
推荐指数
3
解决办法
9844
查看次数

标签 统计

c++ ×3

stl ×2

pointers ×1

standards ×1

unique ×1

unspecified-behavior ×1

vector ×1