这是一个问题,其原因对我来说很模糊,但幸运的是,解决方法很容易。
考虑以下代码(让我称其为 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)
当我尝试编译它时,出现错误:
foobar:~/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) 在以下情况下选择正确的函数重载的正确方法是什么?
#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) 我正在挑战自己只使用 SL 算法、迭代器等编写回文测试器。我还想编写程序以使用原始字符串。下面,我pal在copy_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) 我正在尝试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) 还有一个问题,就是在精神上非常相似这里.不幸的是,这个问题没有引起太多反应 - 我想我会问一个更具体的问题,希望可以提出另一种方法.
我正在写一个二进制文件到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++标准库算法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) 一件简单的事.但我花了一个小时才弄明白.
当我编译以下代码时:
#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) 对于空容器,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".
在更实际的层面上,我正在考虑检查状态的项目集合,就像任何"准备好处理"一样,并期望空集合对应于"否,没有准备好处理的元素".我知道我可以检查它是否是空的,但我正在寻找其他可能性.
#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不会停留在第一个元素,而是贯穿整个向量.有没有什么方法可以使用非独特元素的集合上的擦除删除习惯用法?
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还没有出来,这显然对我没有帮助.
编辑:另外,这是个好主意吗?或者有更好的方法来实现这一目标吗?