标签: stl-algorithm

静态 constexpr 成员似乎不符合 std::min

这是一个问题,其原因对我来说很模糊,但幸运的是,解决方法很容易。

考虑以下代码(让我称其为 my main.cpp):

#include <algorithm>

struct Foo {
    static constexpr float BAR = .42;

    float operator()() const noexcept {
        float zero = .0;
        return std::min(zero, BAR);
    }
};

int main() {
    Foo foo;
    foo();
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,出现错误:

foob​​ar:~/stackoverflow$ g++ -std=c++11 main.cpp
/tmp/ccjULTPy.o: 在函数 'Foo::operator()() const':
main.cpp:(.text._ZNK3FooclEv[_ZNK3FooclEv] +0x1a):对‘Foo::BAR’的未定义引用
collect2:错误:ld 返回 1 个退出状态

如果我使用以下语句,也会发生同样的情况(很明显):

return std::min(zero, Foo::BAR);
Run Code Online (Sandbox Code Playgroud)

下面是上面示例的稍微修改的版本。
这个编译没有错误,即使我仍然指的是BAR成员:

#include <algorithm>

struct Foo {
    static constexpr float BAR = .42;

    float operator()() const noexcept {
        float zero = .0; …
Run Code Online (Sandbox Code Playgroud)

c++ static stl-algorithm constexpr c++11

4
推荐指数
1
解决办法
322
查看次数

如何选择正确的函数重载?

在以下情况下选择正确的函数重载的正确方法是什么?

#include <iostream>
#include <algorithm>

/** the correct overload **/
bool predicate( const char& c )
{
    return c == '0';
}

/** the wrong overload **/
template< typename CharType >    
bool predicate( const CharType& c, int some_other_parameters )
{
    return c == '0';
}

std::string
process_string( const std::string& str )
{
    std::string result;
    std::copy_if( str.begin( ),
                  str.end( ),
                  std::back_inserter( result ),
                  predicate );

    return result;
}

int main()
{
    std::cout << process_string("AK0NNDK0ASDAS0") << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ overloading stl-algorithm template-function c++11

4
推荐指数
1
解决办法
3193
查看次数

从字符指针获取迭代器(C++)

我正在挑战自己只使用 SL 算法、迭代器等编写回文测试器。我还想编写程序以使用原始字符串。下面,我palcopy_if算法中使用了原始指针,但相反,我如何定义一个迭代器来这里,即使用类似begin(pal)and 的东西end(pal + size)

#include <algorithm>
#include <iterator>
#include <cctype>

using namespace std;

bool isPalindrome(const char* pal) {
    if (!pal) { return(false); }

    int size = strlen(pal);
    string pal_raw;
    pal_raw.reserve(size);

    // Copy alphabetical chars only (no spaces, punctuations etc.) into pal_raw
    copy_if(pal, pal+size, back_inserter(pal_raw),
        [](char item) {return isalpha(item); }
    );

    // Test if palindromic, ignoring capitalisation
    bool same = equal(begin(pal_raw), end(pal_raw), rbegin(pal_raw), rend(pal_raw),
        [](char item1, char item2) {return tolower(item1) == …
Run Code Online (Sandbox Code Playgroud)

c++ pointers iterator c++-standard-library stl-algorithm

4
推荐指数
1
解决办法
3936
查看次数

使用std :: generate的随​​机unordered_multimap

我正在尝试unordered_multimap使用以下代码生成大小为10 的随机数:

#include <algorithm>
#include <unordered_map>
#include <cstdlib>

int main()
{
    auto m = std::unordered_multimap<int, int>(10);
    std::generate(
        m.begin(),
        m.end(),
        [](){return std::pair{std::rand(),std::rand()};}
    );
} 
Run Code Online (Sandbox Code Playgroud)

但它不会编译错误

 In file included from /usr/include/c++/7/algorithm:62:0,
                 from main.cpp:2:
/usr/include/c++/7/bits/stl_algo.h: In instantiation of ‘void std::generate(_FIter, _FIter, _Generator) [with _FIter = std::__detail::_Node_iterator<std::pair<const int, int>, false, false>; _Generator = main()::<lambda()>]’:
<span class="error_line" onclick="ide.gotoLine('main.cpp',11)">main.cpp:11:5</span>:   required from here
/usr/include/c++/7/bits/stl_algo.h:4438:11: error: use of deleted function ‘std::pair<_T1, _T2>& std::pair<_T1, _T2>::operator=(typename std::conditional, std::is_copy_assignable<_T2> > >::value, const std::pair<_T1, _T2>&, const std::__nonesuch_no_braces&>::type) [with _T1 = …
Run Code Online (Sandbox Code Playgroud)

c++ stl-algorithm unordered-multimap c++17

4
推荐指数
2
解决办法
75
查看次数

如何迭代到一个较小的容器(即步幅!= 1)

还有一个问题,就是在精神上非常相似这里.不幸的是,这个问题没有引起太多反应 - 我想我会问一个更具体的问题,希望可以提出另一种方法.

我正在写一个二进制文件到std::cin(with tar --to-command=./myprog).二进制文件碰巧是一组浮点数,我想把数据放入std::vector<float>- 理想情况下是c ++方式.

我可以std::vector<char>很好地生成(感谢 这个答案)

#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>

int
main  (int ac, char **av)
{
  std::istream& input = std::cin;
  std::vector<char> buffer;
  std::copy( 
        std::istreambuf_iterator<char>(input), 
           std::istreambuf_iterator<char>( ),
           std::back_inserter(buffer)); // copies all data into buffer
}
Run Code Online (Sandbox Code Playgroud)

我现在想把我std::vector<char>变成一个std::vector<float>,大概是std::transform和一个执行转换的函数(a char[2]到a float,比方说).然而,我正在努力,因为我std::vector<float>将拥有一半的元素std::vector<char>.如果我可以以2的步幅进行迭代,那么我认为我会没事的,但从上一个问题来看,似乎我不能这样做(至少不是优雅的).

c++ iterator stl stl-algorithm

3
推荐指数
1
解决办法
673
查看次数

stdlib"唯一"方法不起作用

我正在尝试使用C++标准库算法unique(带BinaryPredicate).

我已经创建了一对对矢量; 每对都像"(第一个= 4个双倍的矢量,第二个=整数)".第二个元素作为索引,因此在使用`unique之后,我仍然可以告诉原始索引.

在下面的例子中,我创建了这样的东西:


10 20 30 40, 1
10 20 30 40, 2
10 20 30 40, 3
10 20 30 40, 4
10 20 30 40, 5
10 20 30 40, 6
Run Code Online (Sandbox Code Playgroud)

现在我想使用unique函数来比较每对的第一个元素.我使用了自定义二进制预测器uniquepred.实际上,它有效,但使用后矢量不会减少unique.

预期结果

Size before=6
equal!
equal!
equal!
equal!
equal!
Size after=1
Run Code Online (Sandbox Code Playgroud)

实际结果

Size before=6
equal!
equal!
equal!
equal!
equal!
Size after=6
Run Code Online (Sandbox Code Playgroud)

最低工作示例如下.请帮我调试一下.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

typedef std::vector<double> V1db;
typedef std::pair<V1db, int …
Run Code Online (Sandbox Code Playgroud)

c++ unique stl-algorithm

3
推荐指数
2
解决办法
2153
查看次数

模板函数使用for_each()和lambda函数打印C风格的数组

一件简单的事.但我花了一个小时才弄明白.

当我编译以下代码时:

#include <iostream>
#include <sort.h>
#define array_len(arr) ( sizeof(arr) / sizeof (*arr) )

using namespace std;

template<typename ITER>
void printIt_works(ITER b, ITER e) {
    for_each(b, e, [](int it) { cout << it; } ); // putting int explicitly would work
                                                 // but it's not generic
}

template<typename ITER>
void printIt_doesnt_work(ITER b, ITER e) {
    for_each(b, e, [](ITER it) { cout << *it; } );
}

int main() {
    int a[] = {5, 2, 4, 6, 1, 3};

    printIt_doesnt_work(a, a+array_len(a)); …
Run Code Online (Sandbox Code Playgroud)

c++ lambda stl-algorithm c++11

3
推荐指数
2
解决办法
1011
查看次数

使用std :: all_of()和std:none_of()的空容器的好习惯用法?

对于空容器,std :: all_of()和std:none_of()都返回true.

除了辩论这个概念方面,有人可以提出一个成语,不要求总是检查容器是否为空并检查all_of或none_of?

这很麻烦,因为在空容器上的两个算法中使用相同的谓词将表明谓词对于ALL和NONE都是正确的.所以,你的(空)向量是all_of"odd",all_of"even",none_of"odd"和none_of"even".

在更实际的层面上,我正在考虑检查状态的项目集合,就像任何"准备好处理"一样,并期望空集合对应于"否,没有准备好处理的元素".我知道我可以检查它是否是空的,但我正在寻找其他可能性.

c++ stl-algorithm c++11

3
推荐指数
1
解决办法
1451
查看次数

在非唯一集合上使用erase-remove惯用法

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    enum class En{A, B};
    std::vector<En> vec{En::A, En::B, En::A, En::B, En::A, En::B, En::A};

    for(const auto& i : vec) std::cout << int(i) << ", ";
    std::cout << std::endl;

    vec.erase(std::remove(std::begin(vec), std::end(vec), vec.front()), 
              std::end(vec));

    for(const auto& i : vec) std::cout << int(i) << ", ";
    std::cout << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ideone:http://ideone.com/NTPVyE

打印:

0,1,0,1,0,1,0,

1,0,0,0,

为什么会这样?不应该只删除矢量的第一个元素吗?

我想std::remove不会停留在第一个元素,而是贯穿整个向量.有没有什么方法可以使用非独特元素的集合上的擦除删除习惯用法

c++ erase-remove-idiom stl-algorithm c++11

3
推荐指数
1
解决办法
152
查看次数

std :: remove_if是否保证按顺序调用谓词?

std :: remove_if是否总是按顺序调用每个元素的谓词(根据迭代器的顺序),还是可以不按顺序调用?

这是我想做的玩具示例:

void processVector(std::vector<int> values)
{
    values.erase(std::remove_if(values.begin(), values.end(), [](int v)
    {
        if (v % 2 == 0)
        {
            std::cout << v << "\n";
            return true;
        }
        return false;
    }));
}
Run Code Online (Sandbox Code Playgroud)

我需要处理和删除满足特定条件的向量的所有元素,并且erase + remove_if似乎是完美的.但是,我将要做的处理有副作用,我需要确保按顺序处理(在玩具示例中,假设我想按照它们在原始矢量中出现的顺序打印值).

假设我的谓词将按顺序调用每个项目是否安全?

我假设C++ 17的执行策略会消除歧义,但由于C++ 17还没有出来,这显然对我没有帮助.

编辑:另外,这是个好主意吗?或者有更好的方法来实现这一目标吗?

c++ stl erase-remove-idiom stl-algorithm c++11

3
推荐指数
1
解决办法
542
查看次数